C++ にて処理時間を計測する方法を紹介します。
標準ライブラリの chrono を利用したプログラム例です。
目次
処理時間の計測
システム時刻は chrono::system_clock::now
関数で取得することができます。
戻り値は time_point
型です。
time_point
の差分を取得することで、経過時間を算出することができます。
キャストをすることで出力単位(秒やミリ秒など)に応じた数値に変換できます。
C++
#include <chrono>
#include <iostream>
#include <thread>
int main() {
auto start = std::chrono::system_clock::now();
std::this_thread::sleep_for(std::chrono::seconds{3});
auto end = std::chrono::system_clock::now();
auto elapsed_sec = std::chrono::duration_cast<std::chrono::seconds>(end - start);
std::cout << "経過時間 : " << elapsed_sec.count() << " sec" << std::endl;
// 経過時間 : 3 sec
auto elapsed_ms = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
std::cout << "経過時間 : " << elapsed_ms.count() << " msec" << std::endl;
// 経過時間 : 3000 msec
return 0;
}
なお、chrono の利用に <thread>
のヘッダは不要です。
このヘッダはスリープ処理(sleep_for
関数)の目的でインクルードしています。
時間計測用クラスのプログラム例
Timer クラス定義
実用上は、複数の定点間における経過時間を取得したいことが多いと思います。
ストップウォッチのようなイメージで時間計測する目的のクラス実装例を紹介します。
C++
#include <chrono>
#include <iomanip>
#include <iostream>
class Timer {
public:
Timer()
: start_(std::chrono::system_clock::time_point::min()),
prev_(std::chrono::system_clock::time_point::min()) {}
void start() { prev_ = start_ = std::chrono::system_clock::now(); }
void elapsed() {
auto now = std::chrono::system_clock::now();
auto total = std::chrono::duration_cast<std::chrono::seconds>(now - start_);
auto lap = std::chrono::duration_cast<std::chrono::seconds>(now - prev_);
std::cout << "経過時間:" << total.count() << " [sec], ";
std::cout << "ラップ:" << lap.count() << " [sec]" << std::endl;
prev_ = now;
}
private:
std::chrono::time_point<std::chrono::system_clock> start_;
std::chrono::time_point<std::chrono::system_clock> prev_;
};
Timer クラスの使用例
Timer クラスの利用例です。
start メソッドを実行したところで、計測時間のリセットが行われます。
elapsed メソッドを実行するたびに、スタートからの経過時間、直近計測からの経過時間(ラップ)が出力されます。
C++
#include <thread>
int main() {
Timer timer;
timer.start();
std::this_thread::sleep_for(std::chrono::seconds{3});
timer.elapsed();
// 経過時間:3 [sec], ラップ:3 [sec]
std::this_thread::sleep_for(std::chrono::seconds{2});
timer.elapsed();
// 経過時間:5 [sec], ラップ:2 [sec]
return 0;
}
コメント