最終更新日時:
が更新

履歴 編集

処理時間の計測

処理時間の計測には、 Boost Timer Libraryboost::timer::cpu_timerクラスを使用する。

インデックス

基本的な使い方

cpu_timerクラスでは、コンストラクタで時間計測が開始され、format()メンバ関数で計測結果のstd::stringを返す。

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

int main()
{
    boost::timer::cpu_timer timer; // 時間計測を開始

    for (long i = 0; i < 100000000; ++i) {
        std::sqrt(123.456L); // 時間のかかる処理
    }

    std::string result = timer.format(); // 結果文字列を取得する
    std::cout << result << std::endl;
}

実行結果

 5.636670s wall, 5.600436s user + 0.000000s system = 5.600436s CPU (99.4%)

実行結果文字列には、以下の値が印字される:

フォーマット 分解能 説明
wall ナノ秒 実際の経過時間(wall clock time)
user ナノ秒 ユーザーCPU処理時間
system ナノ秒 システムCPU処理時間
=後 ナノ秒 ユーザーCPU処理時間とシステムCPU処理時間の合計時間
%表記 ユーザーCPU処理時間 + システムCPU処理時間の合計時間による、実際の経過時間の%表現

開始、停止、再開を制御する

cpu_timerの開始、停止、再開を制御するには、それぞれstart()stop()resume()メンバ関数を使用する。

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

int main()
{
    boost::timer::cpu_timer timer;

    timer.start(); // 開始

    for (long i = 0; i < 100000000; ++i) {
        std::sqrt(123.456L); // 時間のかかる処理
    }

    timer.stop(); // 停止

    // 中間結果を出力
    {
        std::string result = timer.format();
        std::cout << result << std::endl;
    }

    timer.resume(); // 再開

    for (long i = 0; i < 100000000; ++i) {
        std::sqrt(123.456L); // 時間のかかる処理
    }

    // 最終結果を出力
    {
        std::string result = timer.format();
        std::cout << result << std::endl;
    }
}

実行例

 5.942355s wall, 5.569236s user + 0.000000s system = 5.569236s CPU (93.7%)

 11.981387s wall, 11.247672s user + 0.000000s system = 11.247672s CPU (93.9%)

処理時間の値を個別に取得する

処理時間の値を個別に取得するには、elapsed()メンバ関数を使用する。

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

int main()
{
    boost::timer::cpu_timer timer;

    for (long i = 0; i < 100000000; ++i) {
        std::sqrt(123.456L); // 時間のかかる処理
    }

    boost::timer::cpu_times elapsed = timer.elapsed();

    std::cout << "wall : " << elapsed.wall << std::endl;
    std::cout << "user : " << elapsed.user << std::endl;
    std::cout << "system : " << elapsed.system << std::endl;
}

実行例:

wall : 5622194896
user : 5553635600
system : 0

elapsed()メンバ関数は、boost::timer::cpu_timesクラスのオブジェクトを返す。

boost::timer::cpu_timesクラスは以下のpublicメンバ変数を持つ:

変数名 説明
wall boost::timer::nanosecond_type 実際の経過時間(wall clock time)
user boost::timer::nanosecond_type ユーザーCPU処理時間
system boost::timer::nanosecond_type システムCPU処理時間

これらのメンバ変数は、ナノ秒分解能を表現する整数型である。

出力結果のフォーマットをカスタマイズする

cpu_timer::format()メンバ関数は、デフォルトでは以下のようなフォーマットで印字される。

 5.636670s wall, 5.600436s user + 0.000000s system = 5.600436s CPU (99.4%)

format()メンバ関数に以下のように指定することでフォーマットをカスタマイズできる。

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

int main()
{
    boost::timer::cpu_timer timer;

    for (long i = 0; i < 100000000; ++i) {
        std::sqrt(123.456L); // 時間のかかる処理
    }

    std::string result = timer.format(9, "経過時間:%w秒\n"
                                         "ユーザーCPU処理時間:%u秒\n"
                                         "プロセスCPU処理時間:%s秒");
    std::cout << result << std::endl;
}

実行例

経過時間:5.985288294秒
ユーザーCPU処理時間:5.647236200秒
プロセスCPU処理時間:0.000000000秒

format()メンバ関数の第1引数には、出力される浮動小数点数値の精度を指定する。

デフォルトでは6であり、1~9の範囲で指定することができる(範囲外の場合は丸められる)。

第2引数の文字列フォーマットには、以下の置換シーケンスを指定することができる:

シーケンス 置き換えられる値
%w 実際の経過時間(wall clock time)
%u ユーザーCPU処理時間
%s システムCPU処理時間
%t ユーザーCPU処理時間 + システムCPU処理時間
%p ユーザーCPU処理時間 + システムCPU処理時間の合計時間による、実際の経過時間の%表現