为啥 cpu 性能计数器一直报告 0% cpu 使用率?
Posted
技术标签:
【中文标题】为啥 cpu 性能计数器一直报告 0% cpu 使用率?【英文标题】:Why the cpu performance counter kept reporting 0% cpu usage?为什么 cpu 性能计数器一直报告 0% cpu 使用率? 【发布时间】:2011-01-12 00:22:11 【问题描述】:PerformanceCounter cpuload = new PerformanceCounter();
cpuload.CategoryName = "Processor";
cpuload.CounterName = "% Processor Time";
cpuload.InstanceName = "_Total";
Console.WriteLine(cpuload.NextValue() + "%");
输出总是 0%,而cpuload.RawValue
就像 736861484375 左右,NextValue()
发生了什么?
【问题讨论】:
【参考方案1】:首先检索第一个值(将是 0)
NextValue();
然后等待 1000 毫秒
Thread.Sleep(1000);
然后检索第二个值,这是真正的 cpu 使用情况。
NextValue();
代码应如下所示:
float perfCounterValue = perfCounter.NextValue();
//Thread has to sleep for at least 1 sec for accurate value.
System.Threading.Thread.Sleep(1000);
perfCounterValue = perfCounter.NextValue();
Console.WriteLine("Value: 0", perfCounterValue);
【讨论】:
【参考方案2】:计数器的第一次迭代将始终为 0,因为它与最后一个值没有可比性。试试这个:
var cpuload = new PerformanceCounter("Processor", "% Processor Time", "_Total");
Console.WriteLine(cpuload.NextValue() + "%");
Console.WriteLine(cpuload.NextValue() + "%");
Console.WriteLine(cpuload.NextValue() + "%");
Console.WriteLine(cpuload.NextValue() + "%");
Console.WriteLine(cpuload.NextValue() + "%");
然后你应该会看到一些数据出来了。它可以在恒定图表或更新场景中看到...这就是为什么您不会经常遇到此问题的原因。
这是MSDN reference:
方法 nextValue() 总是返回 第一次调用时为 0 值。那么你 必须再次调用此方法 时间。
【讨论】:
以上是关于为啥 cpu 性能计数器一直报告 0% cpu 使用率?的主要内容,如果未能解决你的问题,请参考以下文章
用 64 位替换 32 位循环计数器会在 Intel CPU 上使用 _mm_popcnt_u64 引入疯狂的性能偏差