是否可以从C#读取内部CPU滴答计数器?

时间:2010-01-10 09:13:33

标签: c# .net performance

我有一个多线程C#程序,我需要记录每个线程在特定旋转等待锁中花费的滴答数。

我知道有从C或汇编程序中执行此操作的方法,但可以通过某种方式直接从C#访问同一个计数器,也就是说,无需通过Stopwatch类(我假设调用Start / Stop on有一些开销,我不确定它有多精确?)

3 个答案:

答案 0 :(得分:8)

在使用System.Diagnostics.Stopwatch“排除”之前:您的测试系统是否支持高分辨率秒表? :见MSDN on 'StopWatch : check-out : 'Frequency and 'IsHighResolution

从StopWatch获得“最佳”的优秀SO主题:SO thread don't miss comments by Eric Lippert

.net时间测量的精确度与准确度:SO thread : Precision vs. accuracy in .NET time measurement可能会有所帮助。

C#到Win32 API中API调用的“成本”:QueryPerformanceFrequency和QueryPerformanceCounter:与StopWatch进行比较?

CodeProject上的一个来自C#的API示例:2006 code, author in a comment says he did not consider thread safety

SO上的其他线程处理了诸如补偿托管代码的一次性JIT命中(“干运行”预热技术),强制垃圾收集和终结器等问题。易于查找。

答案 1 :(得分:4)

您可以使用QueryPerformanceCounter和QueryPerformenceFrequency 您可以找到示例here

System.Diagnostics.Stopwatch应该是一个高绩效的反击 但是,它不存在于Compact Framework中,但上述解决方案解决了这个问题。

答案 2 :(得分:2)

查看基于* QueryPerformance的StopWatch类** API正是出于此目的。

MSDN:

  

秒表课程协助   操纵时间相关的   托管中的性能计数器   码。具体来说,频率   字段和GetTimestamp方法都可以   用来代替非托管的Win32   API QueryPerformanceFrequency和   QueryPerformanceCounter的。

同样results collected by Kristof Verbiest值得一提。