我有一個多線程的C#程序,我需要記錄每個線程在特定的自旋等待鎖中花費多少滴答。我知道有一些方法可以用C或彙編語言來做,但是有可能以某種方式直接從C#訪問相同的計數器,也就是說,不需要通過Stopwatch類(我假設調用Start/Stop在那裏有一些開銷,我不知道它有多精確)?是否有可能從C#中讀取內部CPU刻度計數器?
回答
在使用System.Diagnostics.Stopwatch「排除」之前:您的測試系統是否支持高分辨率秒錶? :見MSDN on 'StopWatch : check-out : 'Frequency and 'IsHighResolution。
優秀SO線程上獲得「最佳」了秒錶:SO thread don't miss comments by Eric Lippert
精密與.NET中的時間測量精度:SO thread : Precision vs. accuracy in .NET time measurement可能會有所幫助。
將C#中的API調用爲Win32 API的「成本」:QueryPerformanceFrequency和QueryPerformanceCounter:與StopWatch相比較?
一個從C#這裏在CodeProject API例如:2006 code, author in a comment says he did not consider thread safety
其他在這裏的線程上SO處理了類似補償的託管代碼一次性JIT命中問題(「幹運行」熱身技術),強制垃圾收集和終結者等等。很容易找到。
您可以使用QueryPerformanceCounter和QueryPerformenceFrequency。
你可以找到一個例子here。
System.Diagnostics.Stopwatch應該是一個高性能計數器。
但是,它沒有出現在Compact Framework中,但上面的解決方案解決了這個問題。
調查StopWatch基於* QueryPerformance **的API正是爲此目的而設計的。
MSDN:
秒錶類協助 操縱的管理 代碼內定時相關 性能計數器。具體來說,頻率 字段和GetTimestamp方法可以使用 來代替非託管Win32 API QueryPerformanceFrequency和 QueryPerformanceCounter。
你爲什麼在乎旋轉等待需要多長時間?他們必須調整,你不能在前面提出一個理想的納秒數。 – 2010-01-10 16:34:05