
時間のかかる処理の場合に限って処理の進捗状況を表示するようにしたいと考えています。このために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です。
こうしたばらつきの原因はなんでしょうか。
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.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 など、様々ソフトウェアが動いているものの上で、健全な環境下では、厳密に揺れを抑えたりすることもできませんし、何が原因かを特定したところで、とても、ご質問者様の希望する「安定」という結果にはなるとは思えません。
5回測定して、実行にかかった時間が0.14秒から0.17秒まで、約20%程度、ばらついた結果となったので、疑問に思いここに質問いたしました。
ユーザにとっては、標準偏差で考えてもあまり意味がないように思います。
今回のコードは単純な処理ですので、その処理中にかなり「重い処理」が断続的に割り込んでいると考えられます。
.NETは関係ありません。質問で説明したコードのみの実行です。
10秒とか100秒とか、もっと長い時間をかければ「重い処理」の影響は目立たなくなるかもしれません。
私の環境ではMac上でWindowsを走らせているので、Mac側の割り込みとWindows側の割り込みの両方が影響しているようです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DoEvents関数って何?
-
C#で書かれたプログラムをバッ...
-
絶対パスの取得について
-
テキストファイルの空行をスキ...
-
Excelでのセル内容の高速消去方法
-
VB.NETにおける二値化処理の高速化
-
ゲームプログラミングの乱数で...
-
C言語 再帰処理のメリットとデ...
-
計算処理時間を出力したい!
-
小数点を含む数値かどうか判断...
-
再帰処理について
-
Macターミナルで実行中のプログ...
-
メモリが不足しています(VBA)
-
VBAの配列サイズとメモリに関して
-
C++ 画像をダウンロード
-
家電製品の電力周波数を変える機械
-
パソコンの演算速度について
-
TCP/IP通信時のサーバーからの受信
-
プロセスIDの取得方法について
-
メッセージボックスのボタン名変更
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBAにて、2GB超の点群デ...
-
小数点を含む数値かどうか判断...
-
プログラム上のCPU稼働率低減に...
-
Excelでのセル内容の高速消去方法
-
DoEvents関数って何?
-
SQLの速度をあげるには・・・
-
win10で、正確な待ち時間の作り方
-
If Not c Is Nothing Then ~延...
-
絶対パスの取得について
-
VC++2010 GDIオブジェクトの解...
-
ノットイコールを教えて下さい
-
C言語:関数を使うメリットとデ...
-
あっち向いてホイのプログラム...
-
再帰呼び出しを使いますか?
-
Excel VBA データ削除の高速化
-
C#で書かれたプログラムをバッ...
-
c言語で自然数nを入力、2以上n...
-
異なるプログラミング言語を連...
-
Excel VBA での処理時間計測結...
-
再帰呼出について
おすすめ情報
コードに不足がありましたので不足分を追記したコードを示します。
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の値が上のようにばらつきます。