2016-04-18 39 views
3

我有一個應用程序,我使用MinGW實現gettimeofday在Win7上實現「精確」時序(約1ms精度)。它工作正常。Win7和Win10之間的計時器差異

但是,當在Win10上使用相同的代碼(甚至是相同的* .exe)時,精度會急劇下降到着名的15.6ms精度,這對我來說是不夠的。

兩個問題: - 你知道什麼可以是這種差異的根源嗎? (這是一個OS配置/「功能」?) - 我該如何解決它?或者更好的是,有沒有一個精確的計時器不可知的OS配置?

注意:std::chrono::high_resolution_clock似乎有相同的問題(至少它顯示Win10的15.6ms限制)。

+2

15.6是正常值,它是你的Win7安裝不當。調用timeBeginPeriod()或使用QueryPerformanceCounter()獲取亞微秒分辨率。 QPF是最好的。 –

+0

「不良行爲」如何表現更好?這是否來自配置選項? – cyrobin

+1

正常和「更好」有相反的目標。電源使用情況很糟糕,您會匆忙排空筆記本電腦電池。不是配置,通常是調用timeBeginPeriod()的程序或驅動程序。 [鉻是臭名昭着](http://blog.codinghorror。COM /爲什麼-確實窗口具備的,可怕的電池壽命/)。運行powercfg -energy來找到Win7上的麻煩製造者。 –

回答

1

從漢斯帕桑特意見,並在我的身邊額外的測試,這裏是一個健全的答案:

的15.6ms(1/64秒)的限制是well-known在Windows上,這是默認的行爲。可以通過調用timeBeginPeriod()來降低限制(例如1ms,儘管我們不建議這樣做),因爲這會影響全局系統計時器分辨率和產生的power consumption。例如,Chrome is notorious for doing this‌​。因此,由於定時器分辨率的全局方面,由於第三方程序的緣故,人們可以觀察1ms的精度而不明確地要求。

此外,要知道,std::chrono::high_resolution_clock對窗口(無論是在Visual Studio或MinGW的情況下)的有效行爲。所以你不能指望這個接口是一個跨平臺的解決方案,並且15.625ms的限制仍然適用。

知道了,我們該如何處理呢?那麼,人們可以使用timeBeginPeriod()的東西來提高一些定時器的精度,但是,我們不建議這樣做:使用QueryPerformanceCounter()(QPC)似乎更好,這是本機代碼的主要API,期待acquire high-resolution time stamps or measure time intervals據微軟稱。請注意,GPC does count elapsed time (and not CPU cycles)。下面是一個使用示例:

LARGE_INTEGER StartingTime, EndingTime, ElapsedMicroseconds; 
LARGE_INTEGER Frequency; 

QueryPerformanceFrequency(&Frequency); 
QueryPerformanceCounter(&StartingTime); 

// Activity to be timed 

QueryPerformanceCounter(&EndingTime); 
ElapsedMicroseconds.QuadPart = EndingTime.QuadPart - StartingTime.QuadPart; 


// 
// We now have the elapsed number of ticks, along with the 
// number of ticks-per-second. We use these values 
// to convert to the number of elapsed microseconds. 
// To guard against loss-of-precision, we convert 
// to microseconds *before* dividing by ticks-per-second. 
// 

ElapsedMicroseconds.QuadPart *= 1000000; 
ElapsedMicroseconds.QuadPart /= Frequency.QuadPart; 

Microsoft,QPC也適合在多核/多線程情況下,儘管它可以不那麼精確/含糊:

當你比較性能計數器結果是從不同的線程獲得的,考慮±1滴答差異的值具有模糊的排序。如果時間戳記來自同一個線程,則這個±1 tick的不確定性不適用。在這種情況下,術語tick指的是一段時間等於1÷(性能計數器的頻率從QueryPerformanceFrequency獲得)。

作爲附加資源,MS還提供FAQ on how/why use QPC和對clock/timing in Windows的解釋。