2015-07-20 37 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納秒的可能性非常小,因此答案是相同的 - 因此爲零。