我试图弄清楚如何获得特定进程的CPU使用率,但只能找到与总体 CPU使用率相关的信息。
有人知道如何提取特定应用程序的当前CPU使用率百分比吗?
发布于 2009-08-14 12:24:28
性能计数器-进程-处理器时间百分比。
为您提供以下想法的小示例代码:
using System;
using System.Diagnostics;
using System.Threading;
namespace StackOverflow
{
class Program
{
static void Main(string[] args)
{
PerformanceCounter myAppCpu =
new PerformanceCounter(
"Process", "% Processor Time", "OUTLOOK", true);
Console.WriteLine("Press the any key to stop...\n");
while (!Console.KeyAvailable)
{
double pct = myAppCpu.NextValue();
Console.WriteLine("OUTLOOK'S CPU % = " + pct);
Thread.Sleep(250);
}
}
}
}
根据进程ID查找实例的说明
我不知道还有更好的方法,希望有人能做到。如果没有,这里有一种方法可以在给定进程ID和进程名称的情况下为您的进程找到正确的实例名称。
在"Process"
系列下有另一个名为"ID Process"
的性能计数器(PC)。它返回实例的PID。因此,如果您已经知道名称(即"chrome“或"myapp"),则可以测试每个实例,直到找到与PID匹配的实例。
每个实例的命名都很简单:"myapp“"myapp#1”"myapp#2“...等。
... new PerformanceCounter("Process", "ID Process", appName, true);
一旦PC的值等于PID,您就找到了正确的appName
。然后,您可以将该appName
用于其他计数器。
发布于 2016-09-20 08:52:56
一种不使用PerformanceCounter计算单个进程的处理器使用率的方法。
using System;
using System.Diagnostics;
namespace cpuusage
{
class Program
{
private static DateTime lastTime;
private static TimeSpan lastTotalProcessorTime;
private static DateTime curTime;
private static TimeSpan curTotalProcessorTime;
static void Main(string[] args)
{
string processName = "OUTLOOK";
Console.WriteLine("Press the any key to stop...\n");
while (!Console.KeyAvailable)
{
Process[] pp = Process.GetProcessesByName(processName);
if (pp.Length == 0)
{
Console.WriteLine(processName + " does not exist");
}
else
{
Process p = pp[0];
if (lastTime == null || lastTime == new DateTime())
{
lastTime = DateTime.Now;
lastTotalProcessorTime = p.TotalProcessorTime;
}
else
{
curTime = DateTime.Now;
curTotalProcessorTime = p.TotalProcessorTime;
double CPUUsage = (curTotalProcessorTime.TotalMilliseconds - lastTotalProcessorTime.TotalMilliseconds) / curTime.Subtract(lastTime).TotalMilliseconds / Convert.ToDouble(Environment.ProcessorCount);
Console.WriteLine("{0} CPU: {1:0.0}%",processName,CPUUsage * 100);
lastTime = curTime;
lastTotalProcessorTime = curTotalProcessorTime;
}
}
Thread.Sleep(250);
}
}
}
}
您可以遍历各个进程以选择其中一个,或者如果您已经知道id,则只需使用此命令而不是GetProcessesByName()
Process p = Process.GetProcessById(123);
发布于 2018-03-02 15:59:04
我已经从几个答案中编译了信息(最明显的是this one),并提出了以下代码,这些代码能够根据Windows提供的性能计数器信息来获取当前进程的CPU和内存使用率信息:
public object GetUsage()
{
// Getting information about current process
var process = Process.GetCurrentProcess();
// Preparing variable for application instance name
var name = string.Empty;
foreach (var instance in new PerformanceCounterCategory("Process").GetInstanceNames())
{
if (instance.StartsWith(process.ProcessName))
{
using (var processId = new PerformanceCounter("Process", "ID Process", instance, true))
{
if (process.Id == (int)processId.RawValue)
{
name = instance;
break;
}
}
}
}
var cpu = new PerformanceCounter("Process", "% Processor Time", name, true);
var ram = new PerformanceCounter("Process", "Private Bytes", name, true);
// Getting first initial values
cpu.NextValue();
ram.NextValue();
// Creating delay to get correct values of CPU usage during next query
Thread.Sleep(500);
dynamic result = new ExpandoObject();
// If system has multiple cores, that should be taken into account
result.CPU = Math.Round(cpu.NextValue() / Environment.ProcessorCount, 2);
// Returns number of MB consumed by application
result.RAM = Math.Round(ram.NextValue() / 1024 / 1024, 2);
return result;
}
实例名称不需要任何hack或猜测就能确定,我也会考虑多核。
检索到的信息与我在VS的进程资源管理器和性能窗口中看到的信息是内联的。
https://stackoverflow.com/questions/1277556
复制相似问题