2012-10-19 48 views
1

因此,我正在编写任务管理器克隆,现在我正在使用它来计算每个进程的CPU使用率%s。问题是这很慢;我只是想知道是否有办法加快这一点。计算CPU使用率的更有效方法

此外,我不允许使用PerformanceCounter的方法和/或WMI。

//Omitted: 
// - Process[] processes just holds the currently running processes 
// - rows[] is a list of the rows I have in a table which shows the tables data 
// - rows[2] is the column for CPU usage 
// - rows[0] is the column for PID 
//======== 
//Do CPU usages 
double totalCPUTime = 0; 
foreach (Process p in processes) 
{ 
    try 
    { 
     totalCPUTime += p.TotalProcessorTime.TotalMilliseconds; 
    } 
    catch (System.ComponentModel.Win32Exception e) 
    { 
     //Some processes do not give access rights to view their time. 
    } 
} 
foreach (Process p in processes) 
{ 
    double millis = 0; 
    try 
    { 
     millis = p.TotalProcessorTime.TotalMilliseconds; 
    } 
    catch (System.ComponentModel.Win32Exception e) 
    { 
     //Some processes do not give access rights to view their time. 
    } 
    double pct = 100 * millis/totalCPUTime; 
    for (int i = 0; i < rows.Count; i++) 
    { 
     if(rows[i].Cells[0].Value.Equals(p.Id)) 
     { 
      rows[i].Cells[2].Value = pct; 
      break; 
     } 
    } 
} 
+0

这可能有所帮助:http://stackoverflow.com/a/278088/1519323 – DaveyLaser

回答

2

使用PerformanceCounter组件来获得不同的性能统计数据:

var cpuCounter = new PerformanceCounter("Process", "% Processor Time", p.ProcessName); 
double value = cpuCounter.NextValue();  

而且here是创建类似任务管理器的样品。

还可以考虑使用Win API函数GetProcessTimes

+0

我不允许使用PerformanceCounter的方法和/或WMI。我会将其编辑到OP –

+0

@BertieWheen有没有你允许使用的列表? :) –

+0

是的。然而,与此相关的事情主要是无法使用PerformanceCounter或WMI。哦,显然我可以使用的最大.NET版本是2.0,但这可能不适用。 –