我正在编写一个小型winforms应用程序,它打开另一个程序的多个实例。 为了优化性能,我正在寻找一种方法来找到最少使用的CPU核心来分配流程。
我还希望能够看到每个核心的使用百分比。没什么好看的,TextBox或Label都没问题。
在遇到这些答案后,我一直在尝试使用PerformanceCounter
:
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();
}
我得到的输出是:
与此同时,任务经理正在展示:
不确定我在这里缺少什么。
答案 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)
答案 2 :(得分:0)
为了进行实验,我想您可以使用GetCurrentProcess()
下的Process
课程中的System.Diagnostics
。从返回的流程中,您可以将ProcessAffinity
属性设置为您检测到的具有最低使用率的核心,以根据您的代码计算每个核心的使用量。
正如其他人所提到的,尝试在实际应用程序中执行此操作是个坏主意。