5

これは頻繁に実行されるコードであり、高速に実行する必要があるため、最速の実装について意見を求めたいと思います。注、実際には、ある程度の精度で完全なミリ秒の解像度が必要です (したがって、秒 * 1000 では十分ではありません)。このプロジェクトでは、Boost を使用しても問題ありません。

編集: ターゲット プラットフォームは x64_86 CentOS5 です。また、OS クロックに依存できることを望んでいるので、継続的に実行されていないプログラムでもこれを使用できます。

4

3 に答える 3

15

C++ には、時間を処理するための chrono ライブラリがあります。

#include <chrono>
#include <iostream>
#include <ctime>

std::chrono::system_clock::duration duration_since_midnight() {
    auto now = std::chrono::system_clock::now();

    time_t tnow = std::chrono::system_clock::to_time_t(now);
    tm *date = std::localtime(&tnow);
    date->tm_hour = 0;
    date->tm_min = 0;
    date->tm_sec = 0;
    auto midnight = std::chrono::system_clock::from_time_t(std::mktime(date));

    return now-midnight;
}

int main()
{
    auto since_midnight = duration_since_midnight();

    auto hours = std::chrono::duration_cast<std::chrono::hours>(since_midnight);
    auto minutes = std::chrono::duration_cast<std::chrono::minutes>(since_midnight - hours);
    auto seconds = std::chrono::duration_cast<std::chrono::seconds>(since_midnight - hours - minutes);
    auto milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(since_midnight - hours - minutes - seconds);
    auto microseconds = std::chrono::duration_cast<std::chrono::microseconds>(since_midnight - hours - minutes - seconds - milliseconds);
    auto nanoseconds = std::chrono::duration_cast<std::chrono::nanoseconds>(since_midnight - hours - minutes - seconds - milliseconds - microseconds);

    std::cout << hours.count() << "h ";
    std::cout << minutes.count() << "m ";
    std::cout << seconds.count() << "s ";
    std::cout << milliseconds.count() << "ms ";
    std::cout << microseconds.count() << "us ";
    std::cout << nanoseconds.count() << "ns\n";
}

得られる解像度が正確に何であるかは、実装によって異なります。VS 11 ベータ版では、解像度が 100ns であると主張されていますが、その精度はわかりません。

11h 51m 57s 285ms 699us 600ns
于 2012-06-20T15:53:47.533 に答える
1

Microsoft の記事「Implement a Continuously Updating, High-Resolution Time Provider for Windows」でQueryPerformanceCounter、高解像度の時刻を取得する方法が詳しく説明されています。

于 2012-06-20T15:17:24.270 に答える
-6

たとえば、毎秒時間を確認するタイマーを作成してみます。午前 0 時までの時間が K 秒未満の場合:

while(True)
{
    if (checkTime() >= MIDNIGHT))
    {
        break; 
    }
}
于 2012-06-20T15:15:16.753 に答える