boost::timerは時間測定なんかに結構手軽で使いやすくてイイんですが,ちょっと困った現象がいくつか発生します.
僕の手元(Ubuntu 10.04 LTS x86 + gcc4.6.0 + boost 1.40)で再現できてるのは,
僕の手元(Ubuntu 10.04 LTS x86 + gcc4.6.0 + boost 1.40)で再現できてるのは,
-
sleepするとおかしい
- プロセスが消費したCPU時間なので,例えばsleep(1)の実行時間を計測しても,値は0です.
-
マルチスレッド化するとおかしい
- 各スレッドでのCPU時間の総和が出るので,何倍かになるし,ちょうど何倍という値でもない.
-
値の最大値が結構残念
- (処理系依存であるものの)2147秒までしか測れない場合がある.
この理由はもう言うまでもないですね,内部実装にC標準関数のclock()を用いているからです.
移植性のためなのは理解できるんですが,ちょっとこれでは困ることも.
ということで,POSIXシステムコールのgettimeofdayを使って再実装してしまえ
…というテーマで記事を書こうとしたんですが,探したらあるもんですね.
POSIXではgettimeofdayを,WindowsではQueryPerformanceCounterを使えるように書いたものがありました.
http://pasokoniziri.blog32.fc2.com/?no=15
これに基づくprogress_timerやprogress_displayを作ろうかとも思いましたがそもそもあれはboostにしては珍しい誰得ライブラリなので放置.
ついでなので,gettimeofdayの精度についてのお話.
http://www.argv.org/~chome/blog/noisefactory/2008/02/gettimeofday.html
へー,おもしれー.