如何获取进程使用的CPU周期数

本文关键字:CPU 周期 何获 取进程 | 更新日期: 2023-09-27 18:00:38

我需要使用C#(或VB.Net)获取特定进程使用的CPU周期数。此信息可在Sysinternal的process Explorer中的process properties弹出窗口中获得。例如,我在发布这条消息时使用的浏览器目前已使用18521360165 cyles(给予或接受数亿)。有人知道如何从.Net应用程序获取这些信息吗?我知道如何获得CPU使用率(百分比),但这不是我想要的。我需要一种方法来比较在不同时间运行的两个不同进程之间的CPU使用情况。

谢谢,马特

更新:
为什么我需要这个?我是本地.Net用户小组的负责人,我们正在进行一项代码挑战,开发人员提交代码来解决问题。我需要一种方法来衡量一个条目与另一个条目的性能。目前我正在使用计时器来测量性能。服务器100%致力于此,但这并不能保证其他事情可能同时发生。显然,这涉及到了各种潜在的问题,但总的来说,这是相当准确的。测量所使用的CPU周期数是衡量一个人的条目相对于另一个条目的表现的一种几乎是愚蠢的方法。我确信有人可以在这里打洞——在这一点上没有必要尝试我希望这有助于解释我的问题背后的原因,以及为什么计时器不足以解决我的问题。

如何获取进程使用的CPU周期数

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

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

您需要查询CPU内部的性能计数器。这是低级别的,而且非常特定于硬件,所以你必须链接到本机代码才能获得它。PAPI是最接近于用于此任务的便携式库的东西。

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

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

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

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