こんにちは。
現役エンジニアの”はやぶさ”@Cpp_Learningです。
WindowsやLinuxなどで動く『マルチプラットフォーム対応』のソフトウェア開発をすることがあります。
C++で処理時間を計測するとき、毎回Timer系ライブラリを検索しているので…
C++11で追加された”chrono”による処理時間計測についての備忘録を書きます。
”chrono”を採用した理由
以下のようなTimer系ライブラリを探していました↓
【求めているTimer系ライブラリ】
- マルチプラットフォーム対応しやすい(C++標準ライブラリがベスト)
- 高精度(msecオーダー)
- 扱いやすい
色々と調査した結果 ”chrono” がベストだと判断しました。
”chrono”による処理時間計測
”chrono”による処理時間計測の『雛形ソースコード』
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <iostream> #include <chrono> int main() { std::chrono::system_clock::time_point start, end; std::time_t time_stamp; start = std::chrono::system_clock::now(); // 計測開始時間 // ======================= // 計測したい処理 // ======================= end = std::chrono::system_clock::now(); // 計測終了時間 // 処理に要した時間 auto time = end - start; // 処理を開始した時間(タイムスタンプ) time_stamp = std::chrono::system_clock::to_time_t(start); std::cout << std::ctime(&time_stamp); // 処理に要した時間をミリ秒に変換 auto msec = std::chrono::duration_cast<std::chrono::milliseconds>(time).count(); std::cout << msec << " msec" << std::endl; return 0; } |
実行結果↓
Sun Feb 10 21:41:26 2019
1 msec
処理を開始した時間(タイムスタンプ)と処理時間を表示します(ミリ時間で表示)。
24行目の”std::chrono::milliseconds”の部分を変更すれば、任意の時間単位に変換できます。
名前空間 ”std::chrono” 定義 | 時間単位 |
std::chrono::nanoseconds | ナノ秒 |
std::chrono::microseconds | マイクロ秒 |
std::chrono::milliseconds | ミリ秒 |
std::chrono::seconds | 秒 |
std::chrono::minutes | 分 |
std::chrono::hours | 時 |
実行環境
本記事で紹介した『雛形ソースコード』はオンライン実行環境“paiza.IO”と以下の記事で紹介しているWSL(Windows Subsystem for Linux)で動作確認しました。
C++コンパイラがインストール済みの環境ならWindows/Linuxどちらでも動きます
おわりに
マルチプラットフォーム対応のソフトウェア開発をするときに便利なC++標準ライブラリの”chrono”で処理時間計測する『雛形ソースコード』を紹介しました。
C++のTimer系ライブラリで何を使うか悩んでいる人は参考になるかも(*・ω・)ノ♪