5

だから私は std::chrono::high_resolution_clock を使用して、何かの実行にかかる時間を計ろうとしていました。開始時間と終了時間の違いを見つけることができると思いました...

私のアプローチが機能することを確認するために、次のプログラムを作成しました。

#include <iostream>
#include <chrono>
#include <vector>

void long_function();

int main()
{
    std::chrono::high_resolution_clock timer;
    auto start_time = timer.now();

    long_function();

    auto end_time = timer.now();
    auto diff_millis = std::chrono::duration_cast<std::chrono::duration<int, std::milli>>(end_time - start_time);

    std::cout << "It took " << diff_millis.count() << "ms" << std::endl;
    return 0;
}

void long_function()
{
    //Should take a while to execute.
    //This is calculating the first 100 million
    //fib numbers and storing them in a vector.
    //Well, it doesn't actually, because it
    //overflows very quickly, but the point is it
    //should take a few seconds to execute.
    std::vector<unsigned long> numbers;
    numbers.push_back(1);
    numbers.push_back(1);
    for(int i = 2; i < 100000000; i++)
    {
        numbers.push_back(numbers[i-2] + numbers[i-1]);
    }
}

問題は、明らかに実際にはそうではないのに、正確に 3000ms を出力することです。

短い問題では、0ms を出力するだけです...何が間違っていますか?

編集:それが役に立たない場合は、-std=c++0x フラグをオンにして GNU GCC コンパイラを使用しています。

4

2 に答える 2

2

high_resolution_clock の分解能は、プラットフォームによって異なります。

以下を印刷すると、使用する実装の解像度がわかります。

    std::cout << "It took " << std::chrono::nanoseconds(end_time - start_time).count() << std::endl;
于 2012-12-11T16:48:46.300 に答える
1

window7の下でg ++(rev5、MinGW-W64プロジェクトによって構築された)4.8.1で同様の問題が発生しました。

int main()
{
    auto start_time = std::chrono::high_resolution_clock::now();
    int temp(1);
    const int n(1e7);
    for (int i = 0; i < n; i++)
        temp += temp;
    auto end_time = std::chrono::high_resolution_clock::now();
    std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(end_time - start_time).count() << " ns.";
    return 0;
}

n=1e7 の場合は 19999800 ns と表示されますが、n=1e6 の場合は 0 ns と表示されます。

精度が悪いようです。

于 2013-09-17T08:39:12.740 に答える