【问题标题】:CPU usage and CPU speedCPU 使用率和 CPU 速度
【发布时间】:2016-04-11 12:21:16
【问题描述】:

我在计算 CPU 利用率时遇到了不同的行为。 在我的代码中,我使用性能计数器“处理器时间”,实例“_Total”和 它似乎工作正常(Windows 性能监视器显示相同的值,Sysinternals Process Explorer 也是如此) , 但 Windows 8 或 10 中的内置任务管理器显示更少,如果电源选项允许平衡 CPU 速度并且 CPU 是 在给定的时刻以较低的频率运行。

是否有任何 C# 的 C 函数,perf。 counter .. 提供此(任务管理器)值, 还是读取当前的 CPU 频率并以某种方式计算?

【问题讨论】:

  • 使用 _Total,从而获得用于 所有 进程的处理器时间,而不仅仅是您的进程,这是非常不寻常的,而不是任务管理器在其进程选项卡中显示的内容。类别很重要,有“处理器”和“处理器信息”。任务管理器使用后者,它是一个更新的计数器类别,试图补偿可变时钟速率和超线程。最好的方法当然是不要在你的程序中添加一个在没有任何帮助的情况下微不足道的装饰物。
  • 谢谢,但是“处理器”和“处理器信息”类别给了我相同的数字,即使 CPU 以大约一半的频率运行。

标签: c# c windows


【解决方案1】:

如果有人会遇到这个要求,我想告诉你我最终是如何解决它的:

显然,Windows 8 包含一个名为“% Processor Utility”的性能监视器计数器。这就是 Win 8 的任务管理器中显示的那个,Win 10 显示为 CPU 利用率。 这个计数器与通常用于显示 CPU 使用率的“% Processor Time”不同,它考虑了平衡的 CPU 速度。

% Processor Utility 是处理器正在完成的工作量,以处理器以标称性能运行时可以完成的工作量的百分比表示并且从不闲着。在某些处理器上,处理器实用程序可能超过 100%。

在c#代码sn-p中:

PerformanceCounter _cpuCounter = new PerformanceCounter("Processor Information", "% Processor Utility", "_Total");
CounterSample firstValue = _cpuCounter.NextSample();
Thread.Sleep(500);
CounterSample secondValue = _cpuCounter.NextSample();
    string cpuUsage = CounterSample.Calculate(firstValue, secondValue).ToString("0.0");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多