clock/getrusage では、呼び出したプロセスの CPU 時間やリソース使用量が利用されるため、sleep/usleep 関数により CPU の利用を停止すると、その間の経過時間は計測されないので注意が必要です。
比較的長い時間の処理で、かつ I/O 等も含めたプログラム全体の処理を測定するには、時刻から経過時間を計測する gettimeofday を用いる方法が無難な方法になります。
times はシステムが起動した時間からのクロック数を返すため、gettimeofday と同様プログラムが CPU を利用しない間も、システム側が利用しているクロックを取得し、経過時間を取得することができます。
プログラム中の一部の処理において CPU 時間を測る場合、短い時間測定には getrusage を利用し、長い場合には、clock を使うのが良いかと思われます。
実際には、I/O 等も含めたプログラム全体の測定することが多いため、gettimeofday を利用することをお勧めします。
clock() : プログラムの使用したプロセス時間の近似値を返す(clock_t 単位の CPU 時間)。
times() : 過去のある時点から経過したクロック数を返す (clock_t 単位の CPU 時間)。
gettimeofday() : 時刻を取得する。
getrusage() : 資源の使用量を取得する。
例題では、Intel プロセッサにおける RDTSC (read-time stamp counter) を利用してクロック数を計測するための関数も用意しています。
これは、インラインアセンブラを利用し、CPU 内のカウンタを直接取得するような方法になります。
実行結果
0 件のコメント:
コメントを投稿