std :: chrono :: duration_cast - 任何比nano-second更精确的单位?

6 c++ visual-c++ c++11

我想问一下,如何计算皮秒,飞秒和更高精度等任何单位的时间.我正在计算函数的运行时间并使用纳秒,当我使用毫秒或纳秒时,函数的运行时间返回0.我认为Chrono库只支持纳秒,这是我在键入chrono后按ctrl + space时出现的最精确的::

int main()
{
    auto t1 = std::chrono::high_resolution_clock::now();
    f();
    auto t2 = std::chrono::high_resolution_clock::now();
    std::cout << "f() took "
              << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count()
              << " milliseconds\n";
}
Run Code Online (Sandbox Code Playgroud)

代码来源:http://en.cppreference.com/w/cpp/chrono/duration/duration_cast

谢谢.

Ale*_*exT 9

你可以用更精确的持续时间计算时间(皮秒......)

www.stroustrup.com/C++11FAQ.html

请参阅以下定义:

typedef ratio<1, 1000000000000> pico;
Run Code Online (Sandbox Code Playgroud)

然后使用:

duration<double, pico> d{1.23}; //...1.23 picoseconds
Run Code Online (Sandbox Code Playgroud)

更新您的问题有三个部分:

  1. 如何使用std :: chrono并使用std :: chrono :: duration进行计算
  2. 如何获得更高精度的时间戳
  3. 如何进行代码的性能测试

上面我部分回答了第一个问题(如何定义"皮秒"持续时间).请考虑以下代码作为示例:

#include <chrono>
#include <iostream>
#include <typeinfo>

using namespace std;
using namespace std::chrono;

void f()
{
    enum { max_count = 10000 };
    cout << '|';
    for(volatile size_t count = 0; count != max_count; ++count)
    {
        if(!(count % (max_count / 10)))
            cout << '.';
    }
    cout << "|\n";
}

int main()
{
    typedef std::ratio<1l, 1000000000000l> pico;
    typedef duration<long long, pico> picoseconds;
    typedef std::ratio<1l, 1000000l> micro;
    typedef duration<long long, micro> microseconds;

    const auto t1 = high_resolution_clock::now();
    enum { number_of_test_cycles = 10 };
    for(size_t count = 0; count != number_of_test_cycles; ++count)
    {
        f();
    }
    const auto t2 = high_resolution_clock::now();
    cout << number_of_test_cycles << " times f() took:\n"
         << duration_cast<milliseconds>(t2 - t1).count() << " milliseconds\n"
         << duration_cast<microseconds>(t2 - t1).count() << " microseconds\n"
         << duration_cast<picoseconds>(t2 - t1).count() << " picoseconds\n";
}
Run Code Online (Sandbox Code Playgroud)

它产生这个输出:

$ ./test
|..........|
|..........|
|..........|
|..........|
|..........|
|..........|
|..........|
|..........|
|..........|
|..........|
10 times f() took:
1 milliseconds
1084 microseconds
1084000000 picoseconds
Run Code Online (Sandbox Code Playgroud)

如你所见,为了获得1毫秒的结果,我不得不重复f()10次.当计时器没有足够的精度时,重复测试是一种常规方法.有一个问题与重复有关 - 重复你的测试N次不需要花费一定比例的时间.你需要先证明它.

另一件事 - 虽然我可以使用皮秒持续时间进行计算,但我的high_resolution_timer不能给出比微秒更高的精度.

要获得更高的精度,您可以使用时间戳计数器,请参阅wiki/Time_Stamp_Counter - 但这很棘手并且特定于平台.


sya*_*ani 6

"标准"PC的分辨率大约为100纳秒,因此除非您拥有某种自定义硬件,否则尝试以高于此值的分辨率测量时间是不可能的.请参阅现代PC的内部时钟精确程度如何?有关问题,请查看第二个答案:https://stackoverflow.com/a/2615977/1169863.