Asa*_*ner 4 c# cpu-usage winforms
我正在写一个小的winforms应用程序,打开另一个程序的几个实例.为了优化性能,我正在寻找一种方法来找到最少使用的CPU核心来分配流程.
我还希望能够看到每个核心的使用百分比.没什么好看的,TextBox或Label都没关系.
PerformanceCounter在遇到这些答案之后,我一直在尝试使用:
我尝试实现如下:
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)
我得到的输出是:

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

不知道我在这里缺少什么.
操作系统在确定使用哪个核心方面可能要好得多.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)