時刻取得関数の精度に関して
Let's Boost の以下の文章が少し気になりました.
Cの標準ライブラリの clock() で実装されているようです。 コンストラクタから、 あるいは restart() した時点からの 経過時間を秒単位のdoubleで得ることが出来ます。
経過時間を測る場合,clock()の他に(POSIX準拠の関数ですが)gettimeofday()という関数があります. そこで,その精度はどちらの方が良いのだろうと思い,少し調べてみました. 調査に使用したプログラムは次の通り.clock()版もほぼ同様のプログラムです.
#include <iostream>
#include <iomanip>
#include <ctime>
#include <sys/time.h>
int main(int argc, char* argv[])
{
struct timeval tv_first, tv_last;
gettimeofday(&tv_first, NULL);
// dummy
unsigned int a = 0;
for (unsigned int i = 0; i < 10000; i++) {
for (unsigned int j = 0; j < 50000; j++) a += i;
}
gettimeofday(&tv_last, NULL);
int sec = tv_last.tv_sec - tv_first.tv_sec;
int usec = tv_last.tv_usec - tv_first.tv_usec;
if (usec < 0) {
sec--;
usec += 1000000;
}
std::cout << sec << '.' << std::setw(6)
<< std::setfill('0') << usec << std::endl;
return 0;
}
そして,その2つのプログラムをそれぞれ1,000回ずつ実行させて, 平均値と標準偏差を出してみました.平均,分散ともにほとんど差はないですが, 若干clock()の方がばらつきが大きいでしょうか.ばらつきが大きいのが, 正確なのか不正確なのか判断が付かないので何とも言えませんが・・・
| - | 平均 (sec) | 標準偏差 (sec) |
|---|---|---|
| clock | 0.223040 | 0.022934 |
| gettimeofday | 0.224633 | 0.015967 |
ただ,どちらにしろミリ秒レベルであれば,大差はなさそうです.