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

时间:2011-06-29 20:27:36

标签: c# vb.net performance process performancecounter

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

谢谢你, 马特

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

3 个答案:

答案 0 :(得分:20)

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

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

答案 1 :(得分:1)

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

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

还要记住,CPU循环次数与(并且在x86上,甚至不相似)“执行的指令数量”不一样。

答案 2 :(得分:1)

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

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