アプリ版:「スタンプのみでお礼する」機能のリリースについて

時間のかかる処理の場合に限って処理の進捗状況を表示するようにしたいと考えています。このためにVBAの処理時間測定を行う次のコードで時間を計測してみましたが結構大きなばらつきがでました。

msmStart = Timer
For i = 1 To 1000
For i2 = 1 To 10000
wk = (wk * 7) Mod 10000
Next i2
Next i
msmEnd = Timer

5回計測したmsmEndの数値です。単位は秒です。

0.1484375
0.1754375
0.15625
0.1484375
0.15625

このばらつきはガベージコレクションが影響しているのかもしれませんが、単純なコードなので疑問があります。

アプリはExelのみ立ち上げており、CPUが4コアなので他の処理の影響は考えにくいです。
環境はWindouws 10、Excel2016です。
こうしたばらつきの原因はなんでしょうか。

質問者からの補足コメント

  • コードに不足がありましたので不足分を追記したコードを示します。

    msmStart = Timer

    For i = 1 To 1000
     For i2 = 1 To 10000
       wk = (wk * 7) Mod 10000
      Next i2
    Next i

    msmEnd = Timer

    msmTime = msmEnd - msmStart '処理時間測定結果を保存する

    このmsmTimeの値が上のようにばらつきます。

      補足日時:2016/08/30 21:38

A 回答 (1件)

平均 0.152344 sec


標準偏差 0.003906
平均に対する割合は、2.6%

これを大きなバラつきというのでしょうか。
こちらでも独自に計測してみましたが、

私には、そんなにバラつきには思えません。倍の時間になったりするというなら、また別ですが。ガベージコレクションっておっしゃると、ComObjectを、.Net から行っているという意味でしょうか。メモリーリークのような現象なら、はっきりとした症状がでます。
また、コードを変えて

Dim CNT As Long
Sub Test2()
 msmStart = Timer
 Dim wk As Double
 For i = 1 To 1000
  For i2 = 1 To 10000
   wk = i * i2
   wk = (wk * 7) Mod 10000
  Next i2
 Next i
 msmEnd = Timer
 CNT = CNT + 1
 Debug.Print CNT; msmEnd - msmStart
End Sub

回数は、50回
AVERAGE 0.606093772
STNDEVP 0.013829674

この結果も、特に問題があるようにも思えません。

もし気になるなら、Microsoft Process Monitor やSystem Explorer など、いろいろなツールで、マクロを実行する際に付随するプログラムや割り込み監視することは可能ですが、こちらでやった結果では、最初のコードで100分の3秒程度の揺れを、現在のWindows関係のように、ネットにつながったり(NetWork Monitorで監視可能)、IME など、様々ソフトウェアが動いているものの上で、健全な環境下では、厳密に揺れを抑えたりすることもできませんし、何が原因かを特定したところで、とても、ご質問者様の希望する「安定」という結果にはなるとは思えません。
    • good
    • 0
この回答へのお礼

5回測定して、実行にかかった時間が0.14秒から0.17秒まで、約20%程度、ばらついた結果となったので、疑問に思いここに質問いたしました。

ユーザにとっては、標準偏差で考えてもあまり意味がないように思います。

今回のコードは単純な処理ですので、その処理中にかなり「重い処理」が断続的に割り込んでいると考えられます。

.NETは関係ありません。質問で説明したコードのみの実行です。

10秒とか100秒とか、もっと長い時間をかければ「重い処理」の影響は目立たなくなるかもしれません。

私の環境ではMac上でWindowsを走らせているので、Mac側の割り込みとWindows側の割り込みの両方が影響しているようです。

お礼日時:2016/09/01 12:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!