【C++】std::chronoで時刻の取得や時間計測、スリープ処理を行う【標準ライブラリ】
std::chronoとは
std::chrono
は C++11 で導入された時間処理のための標準ライブラリで、時刻の取得や時間計測、スリープ処理などを提供します。
クロックの種類
std::chrono
には3種類のクロックが存在します。
std::chrono::system_clock
:システム時間(現在時刻)を取得std::chrono::steady_clock
:不変な時間基準(単調増加クロック)std::chrono::high_resolution_clock
:高精度な時間測定
#include <iostream>
#include <chrono>
int main() {
auto sys_time = std::chrono::system_clock::now();
auto steady_time = std::chrono::steady_clock::now();
auto high_res_time = std::chrono::high_resolution_clock::now();
std::cout << "クロックの取得完了" << std::endl;
}
時刻を表すtime_point
std::chrono::time_point
は、特定のクロックに紐づいた時刻を表します。
#include <chrono>
std::chrono::time_point<std::chrono::system_clock> now = std::chrono::system_clock::now();
時間の表現と算術演算
std::chrono::duration
を用いて時間間隔を表現できます。
#include <iostream>
#include <chrono>
int main() {
std::chrono::seconds sec(10);
std::chrono::milliseconds milli = sec + std::chrono::milliseconds(500);
std::cout << milli.count() << " ミリ秒" << std::endl;
}
現在時刻の取得
現在の時刻を取得し、秒数として出力する方法です。
#include <iostream>
#include <chrono>
int main() {
auto now = std::chrono::system_clock::now();
auto duration = now.time_since_epoch();
auto seconds = std::chrono::duration_cast<std::chrono::seconds>(duration);
std::cout << "現在時刻(エポック秒): " << seconds.count() << std::endl;
}
時間計測
std::chrono
を用いた処理時間の計測例です。
#include <iostream>
#include <chrono>
int main() {
auto start = std::chrono::high_resolution_clock::now();
// 計測対象の処理
for (volatile int i = 0; i < 1000000; ++i);
auto end = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
std::cout << "処理時間: " << duration.count() << " マイクロ秒" << std::endl;
}
スリープ処理
指定した時間だけプログラムを停止させることができます。
#include <iostream>
#include <chrono>
#include <thread>
int main() {
std::cout << "3秒待機..." << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(3));
std::cout << "終了" << std::endl;
}
時間の変換とフォーマット
時間を変換し、フォーマットして表示する方法です。
#include <iostream>
#include <chrono>
#include <ctime>
int main() {
auto now = std::chrono::system_clock::now();
std::time_t now_c = std::chrono::system_clock::to_time_t(now);
std::cout << "現在時刻: " << std::ctime(&now_c);
}