2013-01-23 189 views
3

我是否正確地做?有時,我的程序將打印2000+的計時解決方案,並始終打印1000 CLOCKS_PER_SEC ..每秒計算時鐘數

我實際計算的是什麼值?它是每秒的時鐘嗎?

#include <iostream> 
#include <chrono> 
#include <thread> 
#include <ctime> 

std::chrono::time_point<std::chrono::high_resolution_clock> SystemTime() 
{ 
    return std::chrono::high_resolution_clock::now(); 
} 

std::uint32_t TimeDuration(std::chrono::time_point<std::chrono::high_resolution_clock> Time) 
{ 
    return std::chrono::duration_cast<std::chrono::nanoseconds>(SystemTime() - Time).count(); 
} 

int main() 
{ 
    auto Begin = std::chrono::high_resolution_clock::now(); 
    std::this_thread::sleep_for(std::chrono::milliseconds(1)); 
    std::cout<< (TimeDuration(Begin)/1000.0)<<std::endl; 

    std::cout<<CLOCKS_PER_SEC; 
    return 0; 
} 
+0

咦?你什麼意思是每秒鐘? –

+0

爲什麼clocks_per_sec宏= 1000?以及如何計算我的CPU每秒的週期數量?我正在嘗試編寫一個程序,它可以在每個時間點做一些事情,並且在不使用ASM的情況下儘可能提高準確性。 – Brandon

+0

我可能會建議你使用一個硬件解決方案,如果你想要更好的準確性,你可以通過你的項目的軟件部分來閱讀。 CHEERS –

回答

4

爲了獲得在Linux上每秒正確的刻度,你需要使用的::sysconf(_SC_CLK_TCK)的返回值(在頭unistd.h聲明),而不是宏觀CLOCKS_PER_SEC

後者是POSIX標準–中定義的常量,它與CPU時鐘每秒的實際滴答時間無關。例如,請參見手冊頁clock

C89,C99,POSIX.1-2001。 POSIX要求CLOCKS_PER_SEC等於1000000,與實際分辨率無關。

但是請注意,即使使用正確的每秒鐘滴答次數常量,您仍然無法獲得每秒實際CPU週期數。 「時鐘滴答」是CPU時鐘使用的特殊單位。沒有關於它如何與實際CPU週期相關的標準化定義。

+1

+1。我還認爲值得一提的是,許多現代CPU也有非常複雜的PLL電路,允許動態改變頻率並切斷CPU的某些子部分。 – 2013-01-23 04:22:40

+0

:l我接受了這個答案..仍然..我想知道如何計算Clocks_Per_Sec ..我不喜歡它在Windows上默認定義爲1000的事實。 – Brandon

+0

@CantChooseUsernames我在Windows上遠非專家,但在Windows上看起來,CLOCKS_PER_SEC是最好的。 Boost的[用於Windows的計時實現](http://www.boost.org/doc/libs/1_51_0/boost/chrono/detail/inlined/win/process_cpu_clocks.hpp)也使用它。這個想法是操作系統確保'clock()'返回的數字乘以'CLOCKS_PER_SEC'後,就等於秒數。 CLOCKS_PER_SEC總是1000的事實並不一定與此相矛盾。 – jogojapan

0

在boost的庫中,有一個定時器類,使用CLOCKS_PER_SEC來計算定時器可以經過的最大時間。它說在Windows上CLOCKS_PER_SEC是1000,而在Mac OS X上,Linux是1000000.因此在後者的操作系統上,精度更高。

相關問題