その他の時間計測方法

rdtscp や CPU_CLK_UNHALTED は、細かい性能を計測する場合には便利ですが、大きな粒度で計測したい場合、単位の変換などが面倒です。状況に応じて、色々な方法を使い分けると良いでしょう。

以下、思い付く範囲で時間計測方法について列挙していきます。これで全てでは無いと思いますが、知っていると役に立つこともあるかもしれません。(基本的にはLinuxで説明しています。Linux以外で使えるかどうかは調査していません)

timeコマンド

コマンドの時間を計測できます。bash などで使える time コマンドは、シェルの組み込みコマンドですが、これとは別に/usr/bin/time というコマンドもあります。

/usr/bin/time コマンドに -v を付けると、もう少し色々と情報が取得できます

スワップ回数、スレッド数、メモリ使用量最大量などを簡単に知るのに便利です

perf コマンド

前回説明した、perf_event インターフェースのフロントエンドです。使いかたは色々ありますが、とりあえず、perf stat を使えば、time -v と同じような感覚でコマンドの時間を計測できます

/usr/bin/time -v とは違って、実行した命令数、分岐の回数、分岐ミス率などが取得できます。

clock_gettime

POSIX には、絶対時間を取得するgettimeofdayという関数がありますが、これはobsoleteとなっています。

計測に使う場合にも、以下のような問題が発生する可能性があります。

  • 絶対時刻なので、ntp などが動いて差分が正しく取れない可能性がある。
  • 1970年からの時間なので、世界の時間の進行にあわせて正しく表現するためのbit数が増えていく

かわりに、clock_gettime を使うことが推奨されています。clock_gettimeにCLOCK_MONOTONIC_RAWを渡すと、some unspecified starting point(?) からの時刻を取得できます。

QueryPerformanceCounter

Windows で同じように、時刻を計測するときは、QueryPerformanceCounter を使うと良いでしょう。

QueryPerformanceCounter は、なんらかの64bit カウンタ値を読めるWin32 APIです。このカウンタの増加周波数は、QueryPerformanceFrequency で取得できます。

POSIXインターフェースでは、内部でカウンタ→秒へ変換されてしまうのに対し、Win32インターフェースでは、表示の直前までハードウェアカウンタ値を保持できるので、ハードウェアが同じなら取得できる値が0.5bitぐらい良くなりそうな気がしますね!(確実に無視できる誤差ですが)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です