C++ 標準ライブラリ<chrono>

C++11 によって導入された<chrono>ライブラリ、これは時間と日付を処理するためのライブラリです。<chrono>ライブラリは C++ 標準ライブラリの中で時間に関連する操作を処理する中核となる部分です。

基本概念

時点(Time Points)

時点は特定の時点を表し、通常は特定のクロックに関連付けられます。

持続時間(Durations)

持続時間は、2つの時点の間の時間間隔を表します。

クロック(Clocks)

クロックは、時点と持続時間のソースです。C++ は、システムクロック、高解像度クロックなど、いくつかの異なるクロックを提供します。

基本構文

ヘッダーファイルのインクルード

使用時に<chrono>ライブラリの前に、対応するヘッダーファイルを含める必要があります:

#include <chrono>

時点の使用

auto now = std::chrono::system_clock::now();

持続時間の使用

auto duration = std::chrono::seconds(5);

時点の計算

auto future_time = now + duration;

例

関数の実行時間の測定

以下は、<chrono>ライブラリを使用して関数の実行時間を測定する簡単な例です:

例

#include <iostream>
#include <chrono>

void someFunction() {
    // いくつかの操作をシミュレート
    std::this_thread::sleep_for(std::chrono::seconds(1));
}

int main() {
    auto start = std::chrono::high_resolution_clock::now();

    someFunction();

    auto end = std::chrono::high_resolution_clock::now();

    auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
    std::cout << "Function took " << duration.count() << " milliseconds to execute." << std::endl;

    return 0;
}

出力結果:

Function took 1000 milliseconds to execute.

日付と時刻の処理

<chrono>ライブラリは日付と時刻の処理にも使用できます。以下は、std::chrono::system_clockとstd::chrono::time_point現在の日付と時刻を取得するための例です:

例

#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 << "Current date and time: " << std::ctime(&now_c);

    return 0;
}

出力結果:

Current date and time: Fri Mar 11 12:34:56 2022

高度な使用法

異なるクロックの使用

C++ は複数のクロックを提供しています。例えば:

  • std::chrono::system_clock:システムクロック。通常、システム時間と同期します。
  • std::chrono::steady_clock:モノトニッククロック。システム時間の変化の影響を受けません。
  • std::chrono::high_resolution_clock:最高解像度を提供するクロック。

日付と時刻のフォーマット

を使用すると<iomanip>と<ctime>日付と時刻をフォーマットできます:

例

#include <iostream>
#include <iomanip>
#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::put_time(std::localtime(&now_c), "%Y-%m-%d %H:%M:%S");

    return 0;
}

出力結果:

2022-03-11 12:34:56
その他の拡張