4

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

我还希望能够看到每个核心的使用百分比。没什么花哨的,TextBox 或 Label 就可以了。

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

查找核心编号

超过 2 个内核的 CPU 使用率

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

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

我得到的输出是:

输出

同时,任务管理器显示:

输出

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

4

3 回答 3

7

操作系统在确定使用哪个内核方面可能要好得多。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());
}
于 2012-05-17T15:03:54.933 回答
0

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

在这行代码中:

        coreUsages[i].NextValue();

NextValue()返回一个浮点数。

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

于 2012-05-17T15:37:28.210 回答
0

出于实验的目的,我想您可以GetCurrentProcess()Process. System.Diagnostics从返回的过程中,您可以ProcessAffinity根据您的代码将属性设置为您检测到的使用率最低的内核,以计算每个内核的使用率。

正如其他人所提到的,在实际应用程序中尝试这样做是一个坏主意。

于 2012-05-17T15:39:56.720 回答