對於幾個小時了測量時間,我試圖找到一種方法來衡量assmebly代碼中的時間間隔。到目前爲止我所看到的是,我可以查詢CPU週期的數量,但當然,我需要知道CPU頻率以將週期數轉化爲時間。我找到了rdmsr指令,但它是ring0指令,而ring0不是我可以將代碼放入的東西。組裝
我發現的一些示例調用Windows Query *函數,但我沒有運行視窗。有什麼方法可以測量用戶級別的時間間隔嗎?任何其他方式獲取頻率,或者可能是其他時鐘我可以直接訪問?一秒分辨率系統時鐘當然是不可能的:)
對於幾個小時了測量時間,我試圖找到一種方法來衡量assmebly代碼中的時間間隔。到目前爲止我所看到的是,我可以查詢CPU週期的數量,但當然,我需要知道CPU頻率以將週期數轉化爲時間。我找到了rdmsr指令,但它是ring0指令,而ring0不是我可以將代碼放入的東西。組裝
我發現的一些示例調用Windows Query *函數,但我沒有運行視窗。有什麼方法可以測量用戶級別的時間間隔嗎?任何其他方式獲取頻率,或者可能是其他時鐘我可以直接訪問?一秒分辨率系統時鐘當然是不可能的:)
我花了相當長的一段與週期計數器的工作,並最終來到了(也許明顯)的結論,即RDTSC計數週期,而不是時間。它永遠不會計算時間,因爲計算機的時鐘正在不斷地由電源管理單元上下調整。所以週期計數器對於測量週期是非常精確的,在實時單位中以隨機數量可怕地關閉。我相信英特爾最終通過將週期計數器鎖定在不受PMU影響的時鐘來解決這個問題,但我沒有調查過它。
在Windows查詢*功能並不會真正使用RDTSC週期計數器。我以爲他們這樣做,直到我試圖測量真的小時期,並發現它有一個14MHz(?)滴答,結果是PCI數據總線時鐘。
在這一切之上,每個核心都有自己的週期計數器。所以在執行RDTSC操作碼時必須注意你使用的是哪個內核。每個核心都有自己的PMU。
您將在Windows用戶模式下找到的最好的計時器QueryPerformanceCounter的()和QueryPerformanceFrequency()。
我從來沒有見過這樣的隨機答案。你首先告訴我在我的問題中我說過什麼(它會計算週期而不是時間),而不是解釋我不能使用的函數的某些功能,因爲它可以在與我正在使用的操作系統不同的操作系統中使用,最終使用它來消化。一路上,你沒有教育自己,現代的CPU確實有不斷的和不停的tsc。 – SergeyA
在一個核心或(大概)很短的節目單處理器,'rdtsc'可能做到這一點。 – Downvoter
@cad,rtdsc會怎麼做?它仍然會給我循環的次數,而不是時間! – SergeyA
你有沒有試過'gettimeofday'?它返回unix時代(秒)以及微秒。 –