【C++】std::chronoで時刻の取得や時間計測、スリープ処理を行う【標準ライブラリ】

【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);
}
コメントは受け付けていません。