投稿者 tel | 2012年12月21日

関数内の処理時間を計測する

関数に限らずブロックスコープでの処理時間を計測するのにクラスのコンストラクタとデストラクタで時間の計測をすると便利。

時間の計測は前に作った時間計測のクラスを使う。

struct ScopedTimer {
    ScopedTimer(const char *t) : tag(t) {
        timer.Start();
    }
    ~ScopedTimer() {
        std::cout << tag << ":" << timer.Stop() << std::endl;
    }
    Timer timer;
    const char *tag;
};

#ifdef TIMER_DEBUG
#define SCOPED_TIMER(t) ScopedTimer __timer__(t)
#else
#define SCOPED_TIMER(t)
#endif

リリースでは勝手に消えるようにマクロにしておく。コンストラクタが呼ばれた時に開始時間を求めて、スコープから抜けるときにデストラクタが自動的に呼ばれて終了時間が求められる。

int main(int argc, char *argv[])
{
	SCOPED_TIMER("sample008");

	if(argc > 0) {
		Image<RGB> img, outr, outg, outb;

		{
			SCOPED_TIMER("Load");
			LoadBitmap(argv[1], &img);
		}

		{
			SCOPED_TIMER("Extract");
			ExtractComponentR(&img, &outr);
			ExtractComponentG(&img, &outg);
			ExtractComponentB(&img, &outb);
		}

		{
			SCOPED_TIMER("Save");
			SaveBitmap("sample008_out_r.bmp", &outr);
			SaveBitmap("sample008_out_g.bmp", &outg);
			SaveBitmap("sample008_out_b.bmp", &outb);
		}
	}

	return 0;
}

こんな感じで使うとそれぞれのスコープでの処理時間が表示できる。

Load: 0.00361709
Extract: 0.00550553
Save: 0.0208029
sample008: 0.0400187


コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

カテゴリー

%d人のブロガーが「いいね」をつけました。