ホーム ] 実行時間計測ラブラリ ] EXIF情報ライブラリ ] 文字式演算 ] クイックソートライブラリ ] 多倍長演算ライブラリ ] 多倍長演算ライブラリU ] 画像処理ライブラリ ]

上へ
パフォーマンスカウンタ
時間計測の解析
計測技術

技術解説

時間計測の解析

最終更新日:2007/04/26  全面改訂

●概要

 開始から終了までの掛かった時間を計測するだけであるが、オーバーヘッドや誤差を把握しておく必要がある。

●測定分解能

 基準となる時間間隔にて測定分解能が決まる。システムタイマーの場合は、概ね、50mS 〜100mS であるので、それ以下の事象は測定できない。従って、同じことを何回か繰り返すことになる。パフォーマンスカウンタでは、CPUクロックに等しいか、その何分の1かとなり、数pS からμS オーダとかなり小さくなる。

 このライブラリは、パフォーマンスカンウンタで計測するので以降はそれにそって説明する。

●オーバーヘッド時間

 被計測コードのみを実行させることは不可能で、前後に手続きやループ制御による余計な時間も計測される。これらを把握しておかないと、真値が分からなくなる。

○空ループを測る

 空ループ時間は、今後の時間計測時に、ループ処理時間を無視できる範囲を把握するために必要となる。

For i = 0 To N - 1
   'NOP
Next

の時間を測る。i が、Integer の場合と Long とで、N を 1 から10億までとした。

・Integer


マシン P4 3.2GHz  Win XP で測定

・Long


マシン P4 3.2GHz  Win XP で測定

 いずれも、10万回以上では単位時間が一定に近づいており、計測として評価できる。また、Longの場合は、Integerより時間が長くなっており、うなづける。Forループでは、一回あたり、1〜2nS 掛かる。つまり、被計測部分が、20nS以上であれば正しく計測できる。

○コールバック手続時間を計測する

 中身が空白の関数をコールバックしてその時間を計る。


マシン P4 3.2GHz  Win XP で測定

 筆者のマシンでは、およそ高々170ns でコールバックができている。意外と速い。

●実行時間配分(システムオーバーヘッド)

 これが一番大きな問題となる。今のOSは、マルチタスク、マルチユーザであるから、実行時間の配分は一定の規則で割り当てられる。このカーネル処理のきっかけは、システムタイマー割込み、I/O割込み、スレッドの終了や一時的な休息(DoEvents、メーセージ待ちなど)となる。OSと言えど、これらのきっかけがないと何もできない。これらのきっかけにより、OSはスケジュールを見て動かすプログラム(スレッド)を決める。

 通常のアプリはフォアグランドなので優先度は高い。自分以外誰も居なければ、必ず自分に回ってくるがこれは現実的にはありえない。何もしていないと思っても、通常多数のスレッドが動いている。少なくともフォアグランド処理を自分だけとし、自分では(計測するコードの中では)I/Oを使用しない、セキュリティやネットワークを止める、不要な監視ソフトを止めるなどすれば、比較的自分の時間は確保される。しかし、これでも、周期的に、カーネル処理時間が生じるので、計測時間にこれが入ってくる。

 従って、計測値には、カーネル処理時間 + α(不定) が、ある確率で混入する。事象がいくら短くても混入する機会があるので、計測する時間が短ければ短いほど、測定誤差が大きくなる。この場合はバラツキが大きくなる。

 下図は、5〜6μS 程度の事象を、100μS 程度の間でPerformance Counter にて計測した結果である。概ね良いが、中に、20.77μS になっている測定値がある。これは統計的な誤差ではなく、明らかにシステムオーバーヘッドが混入したと思われる。