プログラムの実行時間を計測する

Windowsでプログラムの実行時間を計るのは簡単ではありません。他のスレッドが計測の邪魔をするからです。

最初に確認しなくてはならない事は、実行時間を計測するために、ソースコードを修正できるか否かです。

前者の場合は、Kernrateパフォーマンスカウンタを使うのが一般的です。
ここでは後者の状況について詳しく検討していきます。


まず、よくある計算方法。

時間計測関数の以下を使います。(参考:その分解能

  • QueryPerformanceFrequency
  • GetTickCount
  • timeGetTime
  • GetSystemTimeAsFileTime

これらは特殊な状況を除いて不合格です。何せ、他のプログラムが動作している時間を全く考慮しません。Windows98なら以下が使えない為、仕方がない。

  • GetProcessTime
  • GetThreadTime

これが正解です。プロセスが複数スレッドを扱う場合は下を使いましょう。

ただし、この関数を呼ぶだけで正確な時間が計れるとおもっちゃいけません。確かにそのプロセスが実行した時間ではあるのですが、CPUやメモリのキャッシュまで考えてくれているわけじゃないからです。余計なプログラムにキャッシュを消されたら時間計測はバラつきます。

つまり、出来るだけCPUを占有する必要があります。(当たり前ですけど)

そこで、次に使うのが以下の関数たちです。状況によっては後者は不要。

  • SetThreadPriority
  • SetThreadAffinityMask

最後の仕上げは基本中の基本。

  • サービスや不要なプログラムを停止させる
  • ネットワークを引き抜く
  • キーボード、マウス等から手を離す

余談になりますが、Windows2000の場合はHyperThreadingを切ると幸せになれる事が多いです。Windows2000はHTを全く知らず、別のCPUであるかのように判断するため、キャッシュミスを連発する原因になるからです。

Leave a Reply

最初のコメントを頂けますか?

更新通知を受け取る »
avatar
wpDiscuz