2010-01-10 35 views
3

我有一個多線程的C#程序,我需要記錄每個線程在特定的自旋等待鎖中花費多少滴答。我知道有一些方法可以用C或彙編語言來做,但是有可能以某種方式直接從C#訪問相同的計數器,也就是說,不需要通過Stopwatch類(我假設調用Start/Stop在那裏有一些開銷,我不知道它有多精確)?是否有可能從C#中讀取內部CPU刻度計數器?

+0

你爲什麼在乎旋轉等待需要多長時間?他們必須調整,你不能在前面提出一個理想的納秒數。 – 2010-01-10 16:34:05

回答

8

在使用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命中問題(「幹運行」熱身技術),強制垃圾收集和終結者等等。很容易找到。

4

您可以使用QueryPerformanceCounter和QueryPerformenceFrequency。
你可以找到一個例子here

System.Diagnostics.Stopwatch應該是一個高性能計數器。
但是,它沒有出現在Compact Framework中,但上面的解決方案解決了這個問題。

2

調查StopWatch基於* QueryPerformance **的API正是爲此目的而設計的。

MSDN:

秒錶類協助 操縱的管理 代碼內定時相關 性能計數器。具體來說,頻率 字段和GetTimestamp方法可以使用 來代替非託管Win32 API QueryPerformanceFrequency和 QueryPerformanceCounter。

另外results collected by Kristof Verbiest值得一看。