使用c#查找使用最少的CPU内核

Asa*_*ner 4 c# cpu-usage winforms

我正在写一个小的winforms应用程序,打开另一个程序的几个实例.为了优化性能,我正在寻找一种方法来找到最少使用的CPU核心来分配流程.

我还希望能够看到每个核心的使用百分比.没什么好看的,TextBox或Label都没关系.

PerformanceCounter在遇到这些答案之后,我一直在尝试使用:

寻找核心号码

CPU使用率超过2个核心

我尝试实现如下:

        StatusBarOutput.Text = "";
        //ignoring posible hyper-threading for simplicity's sake
        var coreUsages = new PerformanceCounter[Environment.ProcessorCount];

        for (var i = 0; i < coreUsages.Length; i++)
        {
            coreUsages[i] = new PerformanceCounter("Processor", "% Processor Time", i.ToString());

            //using the status bar as output for now, doesn't really matter
            StatusBarOutput.Text += "   |   " + coreUsages[i].CounterName + " ~ " + coreUsages[i].NextValue();
        }
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:

产量

同时,任务经理正在显示:

产量

不知道我在这里缺少什么.

RQD*_*QDQ 6

操作系统在确定使用哪个核心方面可能要好得多.MS的人们花了很多时间来优化这个特定的方面.

如果你试图接管它,你是否会为每个新的服务包,操作系统版本,硬件风格等维护这个?

您最好的选择可能是花一些时间来优化流程,而不是试图超越操作系统.

更新:

使用性能计数器,它并不像抓住您找到的第一个值那么简单.您需要至少轮询两次(其间有一些时间)才能获得值.

这不一定是我在现实世界中如何实现这一点,但这里的想法是:

var coreUsages = new PerformanceCounter[Environment.ProcessorCount];

for (var i = 0; i < coreUsages.Length; i++)
{
     coreUsages[i] = new PerformanceCounter("Processor", "% Processor Time", i.ToString());
     coreUsages[i].NextValue();
}

Thread.Sleep(1000);

for (var i = 0; i < coreUsages.Length; i++)
{
     //using the status bar as output for now, doesn't really matter
     Trace.WriteLine("   |   " + coreUsages[i].CounterName + " ~ " + coreUsages[i].NextValue());
}
Run Code Online (Sandbox Code Playgroud)

  • 我实际上发现这是一个有趣的问题.实验没有害处.如果问题集中在测量CPU负载上,我会回答这个问题.但是,OP很友好地描述了他或她的主要目标,所以我采访了这一点. (2认同)