2011-12-07 62 views

回答

4

在當代處理器的Windows 7下,這是CPU(HPET)內部的可靠高精度(納秒)定時器。

在以前的版本和前幾代處理器中,它是「某種東西」,這可能意味着幾乎所有的東西。最常見的情況是,它是由RDTSC指令(或非x86上的一個等效指令)返回的值,它可能是也可能不是可靠的,並且與時鐘無關。請注意,RDTSC(最初根據定義,但現在不再)測量時間,它測量週期

在電流和前一代的CPU,RDTSC通常是可靠和時鐘無關的(即它現在是真的測量時間),對預- 以前生成,特別是在移動設備上或一些多cpu它不是。 「計時器」可能會加速和減速,甚至在不同的CPU上會有所不同,導致「時間旅行」。

編輯:constant tsc標誌CPUID(0x80000007)可以用來告訴RDTSC是否可靠與否(儘管這並不能真正解決問題,因爲做什麼,如果不是這樣,如果有沒有選擇...)。

在較舊的系統(如8-10歲)上,其他一些計時器可能用於QueryPerformanceCounter。這些人可能根本沒有高分辨率,也不準確。

+0

回覆:「請注意,RDTSC不會測量時間,它會測量週期。」,重要的是要注意,您可以直接計算時間以秒爲單位,以「freq * ticks」爲單位。 – Polynomial

+1

@Polynomial:不,你不能,因爲freq!= const。在今天的幾乎所有系統中(以及過去五年中的大多數系統),動態縮放頻率以節省功耗。 – Damon

+0

有趣。有什麼選擇? – Polynomial

1

高分辨率性能計數器通常是從rdtsc指令中提取的,該指令是x86特定的方式來獲取引導後發生的CPU滴答數。它的價值非常精確,通常低至100ns的精度。

將此與GetTickCount()進行比較,精度約爲16ms。

在其他體系結構(它們不在Win32 API的範圍內,因爲它們只能在基於x86的指令集上運行)可能有不同的方法。例如,在ARM上,您可以使用系統控制協處理器(CP15)來做類似的事情。

+0

對於'通常'+1作爲其直到HAL來決定使用什麼 –

+0

@AlexK。 - 是的,它最終取決於HAL。不過,在x86上,我沒有看到使用rdtsc以外的其他原因,因爲它非常精確。如果我沒有記錯的話,它會使用與運行中斷相同的源時鐘,這些中斷的準確計時是非常可笑的。 – Polynomial

+0

@Polynomial:除非您保證客戶不使用可能是4年或5年的CPU,否則不應使用RDTSC,請參閱我的回答。 RDTSC只在_some_ CPU上精確和準確,並不一定全部(並且你無法真正控制你的程序在哪個CPU上運行)。 – Damon