C#程序能以某种方式测量自己的CPU使用情况吗?

我正在研究一个将要运行很长时间的后台程序,并且我有一个外部日志程序( SmartInspect ),我想定期使用一些值来进行debugging,以在debugging时实时监控它。

我知道我可以简单地启动多个程序,比如任务pipe理器,或者IARSN TaskInfo,但是我想把所有的东西放在我自己的程序中,因为我也想添加一些简单的规则,比如程序使用多于X%CPU,在日志中标记这个。

我有一个后台线程,定期向SmartInspect提供一些统计信息,如内存消耗,工作集等。

这个线程是否有可能准确衡量它消耗了多less计算机的CPU资源? 主程序是一个单线程应用程序(除了看门狗线程logging统计),所以如果一种技术被限制在一个线程使用多less,那么这也是一个好主意。

我发现了一些与Linux和C的rusage相关的条目。有没有类似的东西可以用于这个?


编辑:好的,我尝试了性能计数器的方式,但是每次调用时都添加了很多GC数据,所以内存使用和垃圾收集的graphics猛增。 我想我现在就把这个部分留下。

您也可以使用System.Diagnostics。 Process.TotalProcessorTime和System.Diagnostics。 ProcessThread.TotalProcessorTime属性来计算您的处理器使用情况,如本文所述。

看看System.Diagnostics.PerformanceCounter 。 如果运行perfmon.exe ,您将看到可用的性能计数器范围(将“性能对象”设置为“进程”),其中之一是“处理器时间百分比”。

你可以通过System.Diagnostic.PerformanceCounter类。 以下是某人监视CPU使用情况的示例:

http://blogs.msdn.com/dotnetinterop/archive/2007/02/02/system-diagnostics-performancecounter-and-processor-time-on-multi-core-or-multi-cpu.aspx

请注意,这确实需要提升特权。 使用它可能会造成性能下降。

这是好事,你正在login像smartInspect监视器。 但是Windows本身收集每个资源的数据,在这种情况下你的程序(或进程)。 WMI是应用程序监视的标准。 我们可以查看WMI捕获的数据。 许多应用程序pipe理,运行状况监视或应用程序监视工具都支持WMI。

所以我不build议你将应用程序中的CPU使用情况logging到日志文件中。

如果您认为可用性和性能至关重要,那么请使用Microsoft Operations Manager解决scheme等解决scheme。

想了解一下WMI和获取进程列表,请参阅下面的内容: – Win32_PerfFormattedData_PerfProc_Process获取Cpu时间,filter是processID 请参阅本文 – 您可以从Win32_process类中获取processID。

WMI让C#变得简单 Kevin Matthew Goss

 oConn.Username = "JohnDoe"; oConn.Password = "JohnsPass"; System.Management.ManagementScope oMs = new System.Management.ManagementScope("\\MachineX", oConn); //get Fixed disk stats System.Management.ObjectQuery oQuery = new System.Management.ObjectQuery("select FreeSpace,Size,Name from Win32_LogicalDisk where DriveType=3"); //Execute the query ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oMs,oQuery); //Get the results ManagementObjectCollection oReturnCollection = oSearcher.Get(); //loop through found drives and write out info foreach( ManagementObject oReturn in oReturnCollection ) { // Disk name Console.WriteLine("Name : " + oReturn["Name"].ToString()); // Free Space in bytes Console.WriteLine("FreeSpace: " + oReturn["FreeSpace"].ToString()); // Size in bytes Console.WriteLine("Size: " + oReturn["Size"].ToString()); } 

您也可以从远程系统监视进程。

此代码项目文章介绍了如何使用高性能计时器:

http://www.codeproject.com/KB/cs/highperformancetimercshar.aspx

您可以使用它来计算代码的执行时间。

在这里你可以find一些开源的C#分析器:

http://csharp-source.net/open-source/profile