boost::timerは少し困ったちゃんです

boost::timerは時間測定なんかに結構手軽で使いやすくてイイんですが,ちょっと困った現象がいくつか発生します.
僕の手元(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

へー,おもしれー.

コメントを残す

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