我有一个多线程C#程序,我需要记录每个线程在特定旋转等待锁中花费的滴答数。
我知道有从C或汇编程序中执行此操作的方法,但可以通过某种方式直接从C#访问同一个计数器,也就是说,无需通过Stopwatch类(我假设调用Start / Stop on有一些开销,我不确定它有多精确?)
答案 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的。