MS Access Tips/Sample and VBA and Blog customize etc...

VBAでミリ秒以下の高精度で処理時間計測

VBAのコードを書いていて、どちらのコードが速いか確認したときは結構あります。さくっと簡単に処理時間を測ることのできる関数があると便利だと思ったので作ってみました。

クラスにしようかとも思ったのですが、シンプルにに処理の前後にコードを挿入するだけの仕様にしました。

どうせならなるべく高精度な方がいいので、APIの QueryPerformanceFrequency を利用するものにしました。OSや環境によりますが、マイクロ秒単位の精度がでます。

高精度時間計測

難易度:

標準モジュール

下記のページでQueryPerformanceCounteでの時間計測の方法が紹介されています。

QueryPerformanceCounter を使用してコードの時間を計測する方法

これを元に、使いやすいように関数化しました。

標準モジュールを新規作成します。名前は、mdlStopwatch とします。

そこに下記のコードをコピーして貼り付けます。

使用しているシステムで高分解能のカウンタがサポートされていない場合は、エラーが発生します。最近のPCならまず大丈夫です。

また、環境によっては正確な時間計測ができない場合があります。

QueryPerformanceCounterを実時間計測には使えない - 音宮志久のプログラム日記

上記のページの追記でWinVista以降なら問題ないとのことです。XPでCPUクロックが可変の場合は問題があるそうです

使用例

たまに掲示板で 整数の演算をするとき、Integer型よりLong型の方が高速との書き込みを見かけるので確認してみましょう。
下記のように計測したい処理の前に
SWStart
処理の後に
SWStop
SWShow "標題"
を挿入するだけです。"標題"は省略可能です。
結果はイミディエイトウィンドウに出力されます。

私の環境での実行結果は、

1回目
Intrger加算: 0.003
Long   加算: 0.0021
2回目
Intrger加算: 0.0027
Long   加算: 0.0021
3回目
Intrger加算: 0.0024
Long   加算: 0.0021
4回目
Intrger加算: 0.0027
Long   加算: 0.0021
5回目
Intrger加算: 0.0024
Long   加算: 0.0021

単位はミリ秒ですので、0.0021 は 21マイクロ秒ということです。(1マイクロ秒 = 100万分の1秒)

確かにLongの方が高速ですが、100回の加算で数マイクロ秒の差ですので体感できる差がでる場面はなさそうです。

拍手する

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/377-7709398b
該当の記事は見つかりませんでした。