获得以纳秒为单位的时间差

时间:2015-07-20 16:09:27

标签: c++ chrono

参考Obtaining Time in milliseconds

为什么下面的代码会产生零作为输出?

int main()
{
    steady_clock::time_point t1 = steady_clock::now();
    //std::this_thread::sleep_for(std::chrono::milliseconds(1500));
    steady_clock::time_point t2 = steady_clock::now();
    auto timeC = t1.time_since_epoch().count();
    auto timeD = t2.time_since_epoch().count();
    auto timeA = duration_cast<std::chrono::nanoseconds > ( t1.time_since_epoch()).count();
    auto timeB = duration_cast<std::chrono::nanoseconds > ( t2.time_since_epoch()).count();

    std::cout << timeC << std::endl;
    std::cout << timeB << std::endl;
    std::cout << timeD << std::endl;
    std::cout << timeA << std::endl;

    std::cout << timeB - timeA << std::endl;


    system("Pause");
    return 0;
}

输出:

14374083030139686
1437408303013968600
14374083030139686
1437408303013968600
0
Press any key to continue . . .

我认为由于指令执行时间的原因,应该存在几纳秒的差异。

2 个答案:

答案 0 :(得分:3)

在VS2012下,steady_clockand high_resolution_clock)使用GetSystemTimeAsFileTime,其a very low resolution(并且无法启动)。这是Microsoft的acknowledged as a bug

您的解决方法是使用VS2015,使用Boost.Chrono,或使用QueryPerformanceCounter实现自己的时钟(请参阅:https://stackoverflow.com/a/16299576/567292)。

答案 1 :(得分:2)

仅仅因为你要求它代表以纳秒为单位的值,并不意味着测量的精度是以纳秒为单位。

当您查看输出时,您可以看到计数是纳秒/ 100.这意味着计数表示时间,单位为100纳秒。 但即使这样也没有告诉你构建steady_clock的基础计数器的周期。所有你知道的是它不能超过100纳秒。

您可以使用period

steady_clock成员告知计数器的实际使用期限
double periodInSeconds = double(steady_clock::period::num) 
                       / double(steady_clock::period::den);

回到你的问题:&#34;为什么下面的代码产生零作为输出?&#34;

由于您在now()的两次调用之间没有完成任何重要工作,因此您不太可能耗尽100纳秒,因此答案是相同的 - 因此为零。