【问题标题】:controlling CPU utilization控制 CPU 利用率
【发布时间】:2008-11-04 06:39:51
【问题描述】:

如何在运行时控制 CPU 利用率?

轮询 cpu 负载并插入睡眠?

【问题讨论】:

    标签: c# windows


    【解决方案1】:

    我推荐操作系统功能。在 Windows 上有性能计数器和 WinAPI 函数。

    这是一个使用来自BCL Team Blog性能计数器的示例:

    foreach (Process proc in Process.GetProcesses()) {
        using (PerformanceCounter pcProcess = new PerformanceCounter("Process", "% Processor Time", proc.ProcessName)) {
            pcProcess.NextValue();
            System.Threading.Thread.Sleep(1000);
            Console.WriteLine("Process:{0} CPU% {1}", proc.ProcessName, pcProcess.NextValue());   
        }
    }
    

    这段代码与CodeProject中的WMI相同:

    public string GetCPU()
    {
        decimal PercentProcessorTime=0;
        mObject_CPU.Get();
    
        ulong  u_newCPU   = 
          (ulong)mObject_CPU.Properties["PercentProcessorTime"].Value;
        ulong u_newNano   = 
          (ulong)mObject_CPU.Properties["TimeStamp_Sys100NS"].Value;
        decimal d_newCPU  = Convert.ToDecimal(u_newCPU);
        decimal d_newNano = Convert.ToDecimal(u_newNano);
        decimal d_oldCPU  = Convert.ToDecimal(u_oldCPU);
        decimal d_oldNano = Convert.ToDecimal(u_oldNano);
    
        // Thanks to MSDN for giving me this formula !
    
        PercentProcessorTime = 
          (1 - ((d_newCPU-d_oldCPU)/(d_newNano - d_oldNano)))*100m;
    
        // Save the values for the next run
    
        u_oldCPU          = u_newCPU;
        u_oldNano         = u_newNano;
    
        return PercentProcessorTime.ToString("N",nfi);;
    }
    

    因此,如果处理器利用率很高,您可以查询这些操作系统提供商(或其他操作系统提供商)并休眠您的线程。

    【讨论】:

    • 谢谢。我想讨论的是如果“轮询 cpu 负载并插入睡眠”是唯一/最好的选择,那么如何做到这一点。
    【解决方案2】:

    最简单的方法是修改主循环以等待输入(经典的事件驱动模型)或定期休眠一小段时间。

    如果让应用程序进入睡眠状态,我只会使用非常短的超时时间,在 10-100 毫秒范围内的某个地方,因为再多一点,一些用户输入就会延迟,再少一点就会在切换应用程序时涉及更多的操作系统级开销.

    【讨论】:

      猜你喜欢
      • 2018-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      • 1970-01-01
      • 1970-01-01
      • 2013-09-30
      • 1970-01-01
      相关资源
      最近更新 更多