Time::HiResでの礼儀正しい経過時間計測法 このエントリをはてなブックマークに>追加

まあマニュアル通りなんですが。

use Time::HiRes (qw/time gettimeofday tv_interval/);

まちがい

$time = time;
# do something
$elapse = time - $time;

正しい

$time = [ gettimeofday ];
# do something
$elapse = tv_interval $time; # 2つのポイント間を計りたい場合は第二引数にも参照を渡す

マニュアルより。

time -
NOTE 1: This higher resolution timer can return values either less or more than
the core time(), depending on whether your platform rounds the higher resolution
timer values up, down, or to the nearest second to get the core time(), but naturally
the difference should be never more than half a second. See also "clock_getres",
if available in your system.

注意1: タイマーは多かれ少なかれコアのtime()に比べれば解像度の高い時刻を返すことができるが、それは
プラットフォームに環境依存し、解像度は変動する。あるいはCコアのtime()と同じ値に近似することさえある。
しかし普通は0.5秒を超える誤差は起こらない。clock_getresを見よ

逆に読むと、なんと最大で0.5秒の誤差があり、time()と出力が変わらないことすらあるという。そもそもあまり便利な関数ではないらしい。 ここはやはりgettimeofdayを使ってマイクロセカンド秒を取得し、tv_interval関数で差分を取るのがより正確な経過時間を知る方法だ。 そもそも帰ってくるのは浮動小数点数なので、コンマ何秒の計測をする場合には仮にtime()が正確でもより正確な経過時間が期待できる(*)

ちなみにダメな方の方法だと、0.数秒かかる処理が0.0秒ジャストと計測されてしまうことも珍しくない(実体験)。

(*)浮動小数点数はその性質上正確な数値を表せる桁数が限られており、その上UNIXタイムは整数部だけで10桁を消費する。 このためUNIXタイムを浮動小数点数で表すと小数点以下が不正確になることは充分にありえることだ。

コメントをどうぞ。

使用できる XHTML タグ : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>