【问题标题】:Is it possible to read the internal CPU tick counter from C#?是否可以从 C# 读取内部 CPU 滴答计数器?
【发布时间】:2011-01-03 10:35:10
【问题描述】:

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

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

【问题讨论】:

  • 你为什么关心旋转等待需要多长时间?它们必须进行调整,您无法预先设定理想的纳秒数。

标签: c# .net performance


【解决方案1】:

在“排除”使用 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 相比?

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

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

【讨论】:

    【解决方案2】:

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

    System.Diagnostics.Stopwatch 应该是一个高性能计数器。
    但是,它不存在于 Compact Framework 中,但上述解决方案解决了该问题。

    【讨论】:

      【解决方案3】:

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

      MSDN:

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

      results collected by Kristof Verbiest 也值得一看。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-03
        • 2014-07-19
        • 2013-10-15
        • 2011-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多