前々から読みたかったOptimized C++をやっと読めたし、影響を受けてホットスポットの検索やパフォーマンス改善時に使える時間計測クラスをなんとなく作った。
Qiitaに載せていたが大した内容でもないしブログに移行。
使用したのはC++11より追加されたchrono。
#include <iostream> #include <chrono> class measure_time { std::chrono::time_point<std::chrono::steady_clock> start_time; std::chrono::time_point<std::chrono::steady_clock> end_time; public: enum unit { nanoseconds, microseconds, milliseconds, seconds, minutes, hours }; measure_time() { start_time = std::chrono::high_resolution_clock::now(); } auto lap_time(int unit) { end_time = std::chrono::high_resolution_clock::now(); switch (unit) { case unit::nanoseconds: return (end_time - start_time) / std::chrono::nanoseconds(1); case unit::microseconds: return (end_time - start_time) / std::chrono::microseconds(1); case unit::milliseconds: return (end_time - start_time) / std::chrono::milliseconds(1); case unit::seconds: return (end_time - start_time) / std::chrono::seconds(1); case unit::minutes: return (end_time - start_time) / std::chrono::minutes(1); case unit::hours: return (end_time - start_time) / std::chrono::hours(1); default: return -1ll; } } }; int main() { measure_time check_time; // 測定開始 for (auto i = 0; i < 100; i++) std::cout << i << std::endl; // target 1 std::cout << check_time.lap_time(measure_time::unit::microseconds) << std::endl; // lap 1 for (auto i = 0; i < 1000; i++) std::cout << i << std::endl; // target 2 std::cout << check_time.lap_time(measure_time::unit::milliseconds) << std::endl; // lap 2 for (auto i = 0; i < 10000; i++) std::cout << i << std::endl; // target 3 std::cout << check_time.lap_time(measure_time::unit::seconds) << std::endl; // lap 3 return 0; }
コンストラクタ呼び出し時点をstart、lap_time呼び出し時点をendとして計算し返却する。
lap_timeの引数としてスタティック定数を渡してやることで単位の変更が可能。