0Pricing
C++ Academy · レッスン

継続時間とクロック

時間間隔を測定します

「継続時間とクロック」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

なぜ<chrono>なのか

<chrono>ライブラリは、C++で時間を扱うための型安全な方法を提供します。単なる整数ではなく、強い型付けのdurationとtime pointを使うため、コンパイラーが単位の間違いを検出できます。

  • 秒とミリ秒を取り違えることがなくなります。
  • 単位が型システムの一部になります。
#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    seconds s{5};
    std::cout << "Duration: " << s.count() << " seconds\n";
    return 0;
}

Durationとは

std::chrono::durationは時間の長さを表します。tickの回数と、tickの間隔を表す比率を保持します。一般的な単位には定義済みのエイリアスがあります。

  • hours、minutes、seconds
  • milliseconds、microseconds、nanoseconds
#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    milliseconds ms{1500};
    std::cout << ms.count() << " ms\n";
    return 0;
}

Durationリテラル

std::chrono_literals名前空間を使うと、5sや200msのようなサフィックスでdurationを記述できます。コードが通常の文章のように読みやすくなります。

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono_literals;
    auto wait = 3s;
    auto blink = 250ms;
    std::cout << wait.count() << "s, " << blink.count() << "ms\n";
    return 0;
}

Durationの変換

duration_castは単位間の変換を行います。細かい単位から粗い単位へキャストすると切り捨てが発生するため、1500ミリ秒は1秒になります。

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    milliseconds ms{1500};
    seconds s = duration_cast<seconds>(ms);
    std::cout << s.count() << " whole seconds\n";
    return 0;
}

Durationの算術演算

Durationは+、-、*、/をサポートします。単位を混在させると、共通するより細かい単位へ自動的に昇格します。

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    auto total = minutes{2} + seconds{30};
    std::cout << total.count() << " seconds total\n";
    return 0;
}

浮動小数点数のDuration

変換時に小数値を保持するために浮動小数点数の表現を使用できます。これにより、整数のdurationで発生する切り捨てを避けられます。

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    milliseconds ms{1500};
    duration<double> secs = ms;
    std::cout << secs.count() << " seconds\n";
    return 0;
}

Clockとは

Clockは現在時刻を提供します。標準ライブラリには次の3種類があります。

  • system_clock — 暦の時刻
  • steady_clock — 後戻りせず、時間計測に最適
  • high_resolution_clock — 利用可能な中で最も細かいtick
#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    auto now = steady_clock::now();
    std::cout << "Got a time point: " << (now.time_since_epoch().count() > 0) << '\n';
    return 0;
}

system_clock

system_clockは現実世界の暦の時刻を追跡し、表示用にtime_tへ変換できます。システムクロックが調整されると、時刻が跳ぶことがあります。

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    auto tp = system_clock::now();
    auto secs = duration_cast<seconds>(tp.time_since_epoch());
    std::cout << "Seconds since epoch is positive: " << (secs.count() > 0) << '\n';
    return 0;
}

steady_clock

steady_clockは単調です。一定の速度で前方向にのみ進みます。経過時間を計測するときは、必ずsystem_clockではなくこちらを使用してください。

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    auto a = steady_clock::now();
    auto b = steady_clock::now();
    std::cout << "Monotonic: " << std::boolalpha << (b >= a) << '\n';
    return 0;
}

Clockの精度

各Clockは、そのperiodをコンパイル時の比率として公開します。Clockがsteadyかどうかも、コンパイル時に確認できます。

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    std::cout << "steady_clock is_steady: " << std::boolalpha << steady_clock::is_steady << '\n';
    std::cout << "system_clock is_steady: " << system_clock::is_steady << '\n';
    return 0;
}

組み合わせて使う

Clockとdurationを組み合わせます。2つのtime pointを読み取り、選択した単位のdurationとして差を計算します。

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    auto start = steady_clock::now();
    long sum = 0;
    for (int i = 0; i < 1000000; ++i) sum += i;
    auto end = steady_clock::now();
    auto us = duration_cast<microseconds>(end - start);
    std::cout << "Loop took at least 0 us: " << (us.count() >= 0) << '\n';
    return 0;
}

理解度チェック

時間計測にどのClockを使うべきかについての理解度を確認します。

まとめ

<chrono>が提供する機能について学びました。

  • duration — 5sのようなリテラルを使える、型安全な時間の長さ
  • 単位を変換するduration_cast(整数では切り捨てが発生します)
  • Clock — system_clock、steady_clock、high_resolution_clock
  • 間隔の計測にはsteady_clockを使用する

次は、time pointを使って特定の時点を表します。

よくある質問

「継続時間とクロック」レッスンは無料ですか?

はい。「継続時間とクロック」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「継続時間とクロック」で何を学びますか?

時間間隔を測定します ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「継続時間とクロック」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 継続時間とクロック
  2. 時点
  3. コードのパフォーマンス測定
  4. カレンダーとタイムゾーン
← C++ Academyに戻る