2

我正在开发一个大型应用程序,想了解两个时间点之间 CPU 的负载情况。我不仅对我自己的流程感兴趣,而且对所有流程感兴趣。

我的想法是在两个时间段之间获取空闲进程的总 CPU 时间。然后将该值与实际时间差进行比较。然后可以计算在空闲进程上花费的平均 CPU 时间百分比,从而计算在实际进程上花费的平均 CPU 百分比。

例如:

  • 实时样本:2012/07/30 13:56:1 和 2012/07/30 13:56:21
  • 空闲进程总 CPU 时间样本:56:23:10 和 56:23:15
  • 实时差异:20s
  • 空闲进程总CPU时间的差异:5s
  • 空闲进程中的平均 % CPU 时间:25%
  • 实际进程中的平均 % CPU 时间:75%

为了尽可能减少对性能的影响,我只想取两个样本。一个在开头,一个在结尾。

我也不想查看其他进程来计算总 CPU 负载,只查看空闲进程。(例如我不想计算其他进程的总 CPU 时间的总和)

我曾尝试使用 Kernel32.dll OpenProcess。但显然您无法访问空闲进程。它抛出一个 ERROR_ACCESS_DENIED 异常。

这必须是可能的,因为任务管理器显示空闲进程的总 CPU 时间。

注意:我对进程的瞬时 % CPU 时间不感兴趣。只有 Total CPU Time 才能在以后计算平均值。

4

2 回答 2

3

您可能正在寻找这样的东西:

static Program
{
    private static PerformanceCounter cpuCounter = new PerformanceCounter() { 
        CategoryName = "Processor", 
        CounterName = "% Processor Time", 
        InstanceName = "_Total" };

    static void Main()
    {
        cpuCounter.NextValue();
        // Do your processing here.
        float totalCpuUsagePercentage = cpuCounter.NextValue();
    }
}

然后,totalCpuUsagePercentage 将包含自上次 cpuCounter.NextValue() 以来的总负载百分比。

如果您不想要百分比,您可以使用 CounterName = "Processor Time" 代替。

希望这对您的探索有所帮助。

于 2012-07-30T16:43:01.090 回答
0

“空闲进程”很可能不存在。

您可以尝试替换您自己的“空闲进程”,其中包含 [no. 核心]线程,空闲+1优先级,CPU循环,计算经过的时间。那可能行得通。

它还会给你的冷却系统一些锻炼,让你的办公室暖和起来:)

于 2012-07-30T15:59:33.060 回答