タイマ精度

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回ずつ実行させて,平均値と標準偏差を出してみました.

平均 (sec) 標準偏差 (sec)
clock 0.223040 0.022934
gettimeofday 0.224633 0.015967

平均,分散ともにほとんど差はないですが,若干clock()の方がばらつきが大きいでしょうか.ばらつきが大きいのが,正確なのか不正確なのか判断が付かないのがあれですが・・・

まぁ,どちらにしろミリ秒レベルであれば,大差はなさそうです.