在Win32 API中有一個QueryPerformanceCounter函數,用於查詢非常高分辨率的性能計時器的值。什麼是高分辨率性能計數器?
什麼是「高分辨率性能計時器」?它是否由硬件支持?哪些系統不支持它?
在Win32 API中有一個QueryPerformanceCounter函數,用於查詢非常高分辨率的性能計時器的值。什麼是高分辨率性能計數器?
什麼是「高分辨率性能計時器」?它是否由硬件支持?哪些系統不支持它?
在當代處理器的Windows 7下,這是CPU(HPET)內部的可靠高精度(納秒)定時器。
在以前的版本和前幾代處理器中,它是「某種東西」,這可能意味着幾乎所有的東西。最常見的情況是,它是由RDTSC指令(或非x86上的一個等效指令)返回的值,它可能是也可能不是可靠的,並且與時鐘無關。請注意,RDTSC(最初根據定義,但現在不再)測量時間,它測量週期。
在電流和前一代的CPU,RDTSC通常是可靠和時鐘無關的(即它現在是真的測量時間),對預- 以前生成,特別是在移動設備上或一些多cpu它不是。 「計時器」可能會加速和減速,甚至在不同的CPU上會有所不同,導致「時間旅行」。
編輯:的constant tsc
標誌CPUID(0x80000007)可以用來告訴RDTSC是否可靠與否(儘管這並不能真正解決問題,因爲做什麼,如果不是這樣,如果有沒有選擇...)。
在較舊的系統(如8-10歲)上,其他一些計時器可能用於QueryPerformanceCounter。這些人可能根本沒有高分辨率,也不準確。
高分辨率性能計數器通常是從rdtsc
指令中提取的,該指令是x86特定的方式來獲取引導後發生的CPU滴答數。它的價值非常精確,通常低至100ns的精度。
將此與GetTickCount()
進行比較,精度約爲16ms。
在其他體系結構(它們不在Win32 API的範圍內,因爲它們只能在基於x86的指令集上運行)可能有不同的方法。例如,在ARM上,您可以使用系統控制協處理器(CP15)來做類似的事情。
對於'通常'+1作爲其直到HAL來決定使用什麼 –
@AlexK。 - 是的,它最終取決於HAL。不過,在x86上,我沒有看到使用rdtsc以外的其他原因,因爲它非常精確。如果我沒有記錯的話,它會使用與運行中斷相同的源時鐘,這些中斷的準確計時是非常可笑的。 – Polynomial
@Polynomial:除非您保證客戶不使用可能是4年或5年的CPU,否則不應使用RDTSC,請參閱我的回答。 RDTSC只在_some_ CPU上精確和準確,並不一定全部(並且你無法真正控制你的程序在哪個CPU上運行)。 – Damon
回覆:「請注意,RDTSC不會測量時間,它會測量週期。」,重要的是要注意,您可以直接計算時間以秒爲單位,以「freq * ticks」爲單位。 – Polynomial
@Polynomial:不,你不能,因爲freq!= const。在今天的幾乎所有系統中(以及過去五年中的大多數系統),動態縮放頻率以節省功耗。 – Damon
有趣。有什麼選擇? – Polynomial