処理時間をミリ秒単位で計測する
高分解能カウンターの差を周波数で割り、計算ループの経過時間をミリ秒で表示します。
実行前に確認
- Currencyは8バイトの受け皿として使い、カウンターと周波数の同じ倍率が割り算で相殺されます。金額を測る用途ではありません。
- 小数3桁の表示は測定精度の保証ではありません。OSの負荷などで結果は変わります。Mac版および古いVBA6では動きません。
- 公式仕様とコードを照合した例です。Excel実機での実行は未検証です。業務ブックではなくコピーで試してください。
1サンプルコード
Option Explicit
Private Declare PtrSafe Function QueryPerformanceCounter Lib "kernel32" (ByRef value As Currency) As Long
Private Declare PtrSafe Function QueryPerformanceFrequency Lib "kernel32" (ByRef value As Currency) As Long
Sub PracticeAdvanced8013()
Dim startCount As Currency, endCount As Currency, frequency As Currency
Dim i As Long, total As Double, elapsedMs As Double
If QueryPerformanceFrequency(frequency) = 0 Then Exit Sub
If frequency = 0 Then Exit Sub
If QueryPerformanceCounter(startCount) = 0 Then Exit Sub
For i = 1 To 1000000
total = total + Sqr(CDbl(i))
Next i
If QueryPerformanceCounter(endCount) = 0 Then Exit Sub
elapsedMs = CDbl(endCount - startCount) / CDbl(frequency) * 1000#
MsgBox "経過時間: " & Format$(elapsedMs, "0.000") & " ms" & vbCrLf & "計算結果: " & total
End Sub図で見る操作の流れ
イメージ図準備、実行する操作、確認する結果の順で示しています。
準備
Windows版ExcelのVBA7(Office 2010以降)の32/64ビット用です。DeclareをSubの外側に含めて貼り付けます。
操作
高分解能カウンターの差を周波数で割り、計算ループの経過時間をミリ秒で表示します。
結果
100万回の計算ループにかかった時間がmsで表示されます。シートのセルは変更しません。
Currencyは8バイトの受け皿として使い、カウンターと周波数の同じ倍率が割り算で相殺されます。金額を測る用途ではありません。
コードの処理を説明する模式図です。実際の画面や実行結果を撮影したものではありません。
使い方・実行手順を確認する4つの手順で、コードの使い方を確認できます
- 1
Windows版デスクトップExcelの練習用ブックを.xlsmで保存し、Alt+F11→[挿入]→[標準モジュール]へ、この例だけを貼り付けます。
- 2
Windows版ExcelのVBA7(Office 2010以降)の32/64ビット用です。DeclareをSubの外側に含めて貼り付けます。
- 3
PracticeAdvanced8013を実行します。繰り返す場合は他の重いアプリを止め、同じ条件で比べます。
- 4
100万回の計算ループにかかった時間がmsで表示されます。シートのセルは変更しません。