2015-07-20 71 views
1

参照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 . . . 

我想应该是因为指令执行时间几纳秒的差异。

+1

你的滴答不像纳秒,因此滴答计数不能以纳秒精度表示。一定?观察时钟的“周期”来验证。你不能获得比时钟周期更好的精度。 –

+0

即使以毫秒为单位,它也会产生结果为零 –

+2

那么,您的代码不会太多,所以这也不足为奇。如果你重新加入睡眠怎么办? –

回答

2

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

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

可以使用的steady_clock

double periodInSeconds = double(steady_clock::period::num) 
        /double(steady_clock::period::den); 

回到你的问题period成员告诉用作对实际周期:“为什么下面的代码产生零输出?”

由于您在now()这两个调用之间没有做任何重要的工作,因此您已经用完了100纳秒的可能性非常小,因此答案是相同的 - 因此为零。