【问题标题】:How to get the number of CPU cycles used by a process如何获取进程使用的 CPU 周期数
【发布时间】:2011-09-25 11:47:11
【问题描述】:

我需要使用 C#(或 VB.Net)获取特定进程使用的 CPU 周期数。此信息在 Sysinternal 的 Process Explorer 中的 Process properties 弹出窗口中可用。例如,我正在使用发布此消息的浏览器当前使用了 18,521,360,165 个循环(给或取几亿)。有谁知道如何从 .Net 应用程序获取这些信息?我知道如何获取 CPU 使用率(百分比),但这不是我想要的。我需要一种方法来比较在不同时间运行的两个不同进程之间的 CPU 使用率。

谢谢你, 马特

更新:
为什么我需要这个?我是本地 .Net 用户组的负责人,我们正在运行代码挑战,开发人员提交代码以解决问题。我需要一种方法来衡量一个条目相对于另一个条目的性能。目前我正在使用计时器来衡量性能。服务器 100% 致力于此,但这并不能保证同时发生其他事情。显然,这充满了各种潜在的问题,但总的来说,它是相当准确的。测量所使用的 CPU 周期数将是一种几乎万无一失的方法来衡量某人的条目相对于另一个条目的执行情况。我敢肯定,有人可以在这一切上打洞——此时无需尝试。 ;-) 我希望这有助于解释我的问题背后的原因以及为什么计时器不足以解决我的问题。

【问题讨论】:

  • CPU 周期是包括还是不包括 CPU 周期的计数?
  • 理想情况下,我会从不同的过程中进行计数,所以希望排除,但包括也可以。我只需要同一进程的两次运行之间的相对差异(给定不同的输入)
  • 我很想知道您为什么对周期数感兴趣。出于分析目的,计时到毫秒通常就足够了。
  • @Charlie Salts :通常但并非总是如此——我处理的程序的主循环上限为 16.6 毫秒,因此我需要分析的函数都是微量级和纳秒。
  • @Charlie:只需使用秒表即可测量挂钟时间。无法确定调度程序在此期间让您拥有 CPU 多长时间。

标签: c# vb.net performance process performancecounter


【解决方案1】:

您需要查询 CPU 内的性能计数器。这是低级别且非常特定于硬件的,因此您必须使用本机代码才能获得它。 PAPI 是最接近此任务的可移植库。

请注意,上下文切换可以更改许多内部 CPU 寄存器,因此您需要从进程内部执行此查询。从不同的进程查询 CPU 计数器会得到虚假的结果。

还请记住,CPU 周期数与“执行的指令数”不同(在 x86 上,甚至不相似)。

【讨论】:

  • OP 想查询操作系统维护的性能计数器,而不是自己确定。
  • @Gabe:是的,性能计数器是理想的。
【解决方案2】:

这里有一篇 CodeProject 文章:http://www.codeproject.com/KB/system/processescpuusage.aspx

我认为这篇文章将帮助您完成您正在尝试做的事情。基本上,它们向您展示了两种方法,一种使用托管 System.Diagnostics 工具,另一种使用 Win API 方法调用。

【讨论】:

  • 正如我在问题中所说,知道 CPU 使用率并不是我要寻找的,而是我需要知道 CPU 用于特定进程的周期数。跨度>
【解决方案3】:

Process Explorer 调用QueryProcessCycleTime 来获取该信息。您可能必须使用 P/Invoke 来调用它。我希望它的 P/Invoke 签名看起来像:

[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool QueryProcessCycleTime(IntPtr ProcessHandle, out ulong CycleTime);

【讨论】:

  • 这看起来很有希望!谢谢!
  • 我刚试过这个,它似乎完美无缺!惊人的。谢谢你,加布。
  • @Matt:你也可以考虑使用QueryThreadCycleTime,只隔离你感兴趣的线程。
  • 很好,我也试试。谢谢!
  • 这里是QueryThreadCycleTimeQueryProcessCycleTime的使用示例:gist.github.com/zhangz/6094657
猜你喜欢
  • 2010-09-13
  • 2014-03-26
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 2012-10-16
相关资源
最近更新 更多