10

<chrono>C++ 11 の新しいヘッダーについていくつか質問があります。Windows 7、Visual Studio 2012 を使用しています。

例を見るhttp://en.cppreference.com/w/cpp/chrono

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

int fibonacci(int n)
{
    if (n < 3) return 1;
    return fibonacci(n-1) + fibonacci(n-2);
}

int main()
{
    std::chrono::time_point<std::chrono::system_clock> start, end;
    start = std::chrono::system_clock::now();
    int result = fibonacci(42);
    end = std::chrono::system_clock::now();

    int elapsed_seconds = std::chrono::duration_cast<std::chrono::seconds>
                             (end-start).count();
    std::time_t end_time = std::chrono::system_clock::to_time_t(end);

    std::cout << "finished computation at " << std::ctime(&end_time)
              << "elapsed time: " << elapsed_seconds << "s\n";
}

可能な出力

finished computation at Sat Jun 16 20:42:57 2012
elapsed time: 3s
  1. std::chrono::system_clock::now();使用例は、CPU時間ではなく経過時間のみを測定するために使用できることを意味することに気付きました??? また、CPU 時間を測定したい場合は、どのクロックを使用すればよいですか?
  2. elapsed time: 3s出力は整数に丸められることに注意してください。もっと細かくする方法はありますか?
4

2 に答える 2

15
  1. 正しい

    標準によると:

    system_clock は、システム全体のリアルタイム クロックからのウォール クロック時間を表します。

    このライブラリは CPU 時間を測定するメカニズムを提供していないため、必要な場合は古いライブラリ<chrono>に戻ってを使用する必要があります。<ctime>std::clock()

    (また、Windows をターゲットにしている場合は、ご指摘のとおり、Windows が CPU 時間を取得するために提供するプラットフォーム固有の API にフォールバックする必要がありますstd::clock()。)

    system_clockは よりも に対応するようなものstd::time()ですstd::clock()。(たとえば、 はと の間のsystem_clock変換を提供することに注意してください。) CPU 時間を測定するためのクロックが不足しているのは、標準委員会の時間の制約と、その機能がシステムの壁時計および実際のクロックよりも使用されていないという事実によるものだと思います。 -タイムクロック。system_clock::time_pointtime_t<chrono>

    CPU 時間が必要であると同時に、提供される利点も必要<chrono>な場合は、標準で概説されているクロックの概念に準拠し、CPU 時間を提供するクロック タイプを実装する必要がありますstd::clock()

  2. と言う行

    int elapsed_seconds = std::chrono::duration_cast<std::chrono::seconds>
                        (end-start).count();
    

    これにより、時間が整数の秒数に丸められます。任意の期間を選択するか、整数以外の値を許可するために浮動小数点表現を使用できます。

    std::int64_t elapsed_attoseconds =
        std::chrono::duration_cast<std::chrono::duration<std::int64_t, std::atto>>
            (end-start).count();
    
    double elapsed_seconds =
        std::chrono::duration_cast<std::chrono::duration<double,std::ratio<1>>>
            (end-start).count();
    

    実際のコードでは、絶対に必要になるまで.count()、 によって提供される強力な型指定をエスケープするためにを使用することは避けるべきであることに注意してください。chrono::duration

    auto total_duration = end - start;
    auto seconds = std::chrono::duration_cast<std::chrono::seconds>(total_duration);
    auto milli = std::chrono::duration_cast<std::chrono::milliseconds>(total_duration - seconds);
    
    std::cout << seconds.count() << "s " << milli.count() << "ms\n";
    
于 2012-12-02T05:37:37.547 に答える
4

1)私は、あなたが得ることができる最高の解像度は、使用することstd::chrono::high_resolution_clockであり、持続時間のキャストを行わないことであると確信しています:

int elapsed_ticks = (end-start).count();

2) duration_cast の引数を次のように変更しますnanoseconds

int elapsed_seconds = std::chrono::duration_cast<std::chrono::nanoseconds>
                             (end-start).count();
于 2012-12-02T04:21:05.050 に答える