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

时间:2012-05-17 15:00:04

标签: c# winforms cpu-usage

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

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

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

Finding core number

CPU usage for more than 2 cores

我尝试按如下方式实施这些:

        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();
        }

我得到的输出是:

output

与此同时,任务经理正在展示:

output

不确定我在这里缺少什么。

3 个答案:

答案 0 :(得分: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());
}

答案 1 :(得分:0)

啊!我可能看看它是什么。

在这行代码中:

        coreUsages[i].NextValue();

NextValue()返回一个浮点数。

如果您将0.35(或35%)转换为整数,则会得到0。

答案 2 :(得分:0)

为了进行实验,我想您可以使用GetCurrentProcess()下的Process课程中的System.Diagnostics。从返回的流程中,您可以将ProcessAffinity属性设置为您检测到的具有最低使用率的核心,以根据您的代码计算每个核心的使用量。

正如其他人所提到的,尝试在实际应用程序中执行此操作是个坏主意。