或许这个问题更像是“我在这里做了什么明显的错误?”
我有一个测试应用程序除了查看自己的cpu使用情况外什么都不做。看起来有点像这样:
protected PerformanceTrace()
{
Process currentProcess = Process.GetCurrentProcess();
this.cpuCounter = new PerformanceCounter("Process", "% Processor Time", currentProcess.ProcessName);
this.coreCount = Environment.ProcessorCount;
}
private int coreCount;
private DateTime lastCpuRead = DateTime.MinValue;
private float _cpuUsage;
private float CpuUsage
{
get
{
if ((DateTime.Now - this.lastCpuRead) > TimeSpan.FromSeconds(1.0))
{
this._cpuUsage = this.cpuCounter.NextValue();
}
return this._cpuUsage / this.coreCount;
}
}
非常频繁地读取CpuUsage属性。事情就是这样:
在我的机器上,Environment.ProcessorCount
产生的值为2.但是,来自计数器的值通常高达800.我假设它与多核和超线程有关。我该怎么做才能获得我正在寻找的实际价值? (此特定过程的处理器总时间百分比)
答案 0 :(得分:0)
您必须将性能计数器的数量除以CPU数量乘以每个CPU的实际线程数 - 每个核心一个,如果超线程是一个因素,则每个核心加一个。
在C#中,我不知道如何确定这一点。在本机代码中,您可以使用GetLogicalProcessorInformation和its associated structure来计算逻辑处理器,包括共享核心的处理器。