opamp_sando's blog

クソザコが割りと適当なことを書くためにある備忘録です。あとたまに普通の日記も書きます

boostのtimerを使って簡単に時間を測ってみたり

今日はなんかちゃんとした内容書こうと思ってboostのTimerを使って見ることにした
まだcpuタイマーとオリジナルタイマーと2つ利用できるようだが、今日はcpuタイマーをちょっと使ってみた。

ちなみにboostのtimerを使うにはlibboost_systemとlibboost_timerを実行ファイルにリンクする必要がある。


例えばsleep関数を使って10秒くらい待たせてそれの実行時間をcpu timerを使って測ってみる。

#include<unistd.h>
#include<boost/timer/timer.h>
#include<cstdlib>

int main(int argc,char* argv[]){
    boost::timer::auto_cpu_timer t;

    sleep(10); //sleep 10 sec.

    return 0;
}

とするだけ。これだけ書いてコンパイル -> 実行するとそれだけで時間を測ってくれる。
以下実行結果

$ ./a 
 10.000076s wall, 0.000000s user + 0.000000s system = 0.000000s CPU (n/a%)

一番左がそう。

ちなみにboostのドキュメントに載ってるサンプル(以下)を実行すると

#include <boost/timer/timer.hpp>
#include <cmath>

int main()
{
  boost::timer::auto_cpu_timer t;

  for (long i = 0; i < 100000000; ++i)
    std::sqrt(123.456L); // burn some time

  return 0;
}

実行結果

$ ./a 
 1.278725s wall, 1.260000s user + 0.000000s system = 1.260000s CPU (98.5%)

のように表示され、約1秒程度の処理時間がかかってることがわかる。

これがboostのtimerのうちauto_cpu_timerというもののようだ。


続いてcpu_timerというものを使ってみる。auto_cpu_timerはcpu_timerを継承しているようだ...

とりあえずこんなコードを書いてみた

#include<iostream>
#include<string>
#include<unistd.h>
#include<boost/timer/timer.hpp>


int main(int argc,char** argv){
        using namespace std;        
        boost::timer::cpu_timer t; // create cpu_timer.

        sleep(1); // sleep 1 sec.

        t.start(); // timer start.

        sleep(5); // sleep 5 sec.

        t.stop(); // stop timer.

        cout<<t.format(10," %ws wall, %us user + %ss system = %ts CPU (%p%)\n")<<endl; //report

        sleep(1); // sleep 1 sec.

        cout<<t.format(10," %ws wall, %us user + %ss system = %ts CPU (%p%)\n")<<endl; //report2
        return 0; //quit
}

という感じ。以下プログラムの動作予想

最初の方のboost::timer::cpu_timerでcpu_timerを作成している。

その後1秒waitし、ここからタイマーをスタートさせる。

そして5秒waitし、タイマーを止め、タイマーの結果を出力している。(formatについては後述)

この時点でタイマーはスタートしてからの時間だとすると5秒が出力されるはず.

その後さらに(タイマーは止めたまま)1秒waitし、さらに同じように出力させている。

=> この2回目の出力も1回目と同じ結果になるはずだ。

早速実行して確かめてみる

$ ./a 
 5.000073078s wall, 0.000000000s user + 0.000000000s system = 0.000000000s CPU (n/a%)

 5.000073078s wall, 0.000000000s user + 0.000000000s system = 0.000000000s CPU (n/a%)

どうやら予想通りの動作をしてくれたようだ。

cpu_timerはデフォルトでは止まっていないようだがstartをすると再度0からカウントしてくれるようになってるようだ。
(タイマーが止まってるかどうかは bool cpu_timer::is_stopped() を使うと確認できる。止まっているならtrueを返す。)


最後にformatについてだが、formatはタイマーの結果を出力するときの書体を決めることができるようだ。
今回指定してある

" %ws wall, %us user + %ss system = %ts CPU (%p%)\n"

は、auto_cpu_timerの出力と同じになるような書き方。

使えるオプション?は

%w  times.wall
%u  times.user
%s  times.system
%t  times.user + times.system
%p  The percentage of times.wall represented by times.user + times.system

となってるようだ。

ちなみに今回使ったのはboost 1.48.0 (現在の最新版)で、cmakeを使ってmakefileを作成しMacOSX標準のgccでコンパイルした。
cmakeを使わなくてもできるがその場合gccなら-IオプションでboostのあるディレクトリにインクルードPATHを通して、-lで最初の方に書いたlibboost_systemとlibboost_timerの2つのライブラリをリンクする必要がある。

感想... この昨日をうまく使えば簡単なベンチマークが取れるかもしれないな...

boostのドキュメントも参照(英語だけど)

Firefox ブラウザ無料ダウンロード