web-dev-qa-db-ja.com

C ++ 11高解像度クロックtime_pointを印刷する方法

Time_pointがhigh_resolution_clockから取得されたときにtime_pointを出力するにはどうすればよいですか?

timestamp = std::chrono::high_resolution_clock::now();
std::time_t now = std::chrono::system_clock::to_time_t(timestamp);
std::cout << std::ctime(&now) << std::endl;

コンパイル時に次のエラーメッセージが表示されます。

error: no viable conversion from 'time_point<class std::__1::chrono::steady_clock, duration<[...], ratio<[...], 1000000000>>>' to 'const time_point<class std::__1::chrono::system_clock, duration<[...], ratio<[...], 1000000>>>'
        time_t tt = std::chrono::system_clock::to_time_t(timestamp);
12
John

これを行うための本当に優雅な方法はありません。 high_resolution_clockは、UTCまたはその他のカレンダーに関連していることがわかっていません。移植可能にできることの1つは、指定されていないエポックから現在の期間を、その期間の単位とともに出力することです。

#include <chrono>
#include <iostream>

int
main()
{
    using Clock = std::chrono::high_resolution_clock;
    constexpr auto num = Clock::period::num;
    constexpr auto den = Clock::period::den;
    std::cout << Clock::now().time_since_Epoch().count()
              << " [" << num << '/' << den << "] units since Epoch\n";
}

私にとってどれが出力しますか:

516583779589531 [1/1000000000] units since Epoch

これは、私のマシンでこの時計のエポックから516583779589531ナノ秒(または516,583.779589531秒)であることを意味します。私のマシンでは、これは次のように解釈されます。私のマシンはほぼ6日間起動されています。しかし、その翻訳は移植性がありません。

ああ!そして、エラーメッセージから libc ++ を使用していることに注意してください。 OS Xも使用している場合、high_resolution_clockの定義は同じです。コンピュータが起動してからナノ秒をカウントします。

14
Howard Hinnant

少なくとも私が物事を読んでいるとき、その意図はstd::high_resolution_clockは、CPUのタイムスタンプカウンターのようなもののラッパーとして定義できます。これは、CPUクロックサイクルごとにインクリメントされる単なるレジスタです。

これは必ずしも当てはまるわけではありませんが(現在のシステムではCPUクロック周波数を絶えず変更しているため、おそらくお勧めできません)、他の同様のクロックもサポートすることを目的としています。

結論:絶対時間と高解像度時計の間に既知の関係がない可能性があるため、実際には、絶対時間ではなく、期間のみを生成するように定義されています。

3
Jerry Coffin