我已经读过,当你在不同的线程(并行)中运行长时间运行的操作时,当你的PC有多个处理器核心时,性能会有明显的改善。在C#中有一个函数Parallel.ForEach
,据我所知,它将长时间运行的操作拆分为在每个处理器核心上运行的单独线程。虽然,如果只有一个核心,这个函数将作为一个简单的Foreach
循环(同步)运行。此外,如果您创建的线程数多于处理器核心数,则可能会产生负面影响。
我正在考虑创建一个单独的控制台应用程序,将args
传递给它并在start -WindowStyle Hidden SeparateProcess.exe
等多个进程上运行它的.exe。
编辑: 我已经创建了这样的控制台应用程序
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 100; i++)
{
Thread.Sleep(200);
Console.WriteLine("" + i);
}
Console.WriteLine();
Console.WriteLine(Guid.NewGuid() + ": Process finalized.");
}
}
然后,使用powershell多次执行:
For ($i=0; $i -lt 10; $i++){
start -WindowStyle Normal SeparateProcess.exe
}
在单核上运行时,这会改善程序性能吗?
注意:长时间运行的任务是Emgu CV图像计算算法。
你应该通过尝试来检查自己,但......
有没有办法改善长时间运行的任务性能,即使只有一个核心?
是的,但显然不是通过并行运行它。您可以在代码上使用性能分析器来找出哪些部分花费的时间最多,并尝试以更优化的方式重写它。
根据评论编辑:
如果你正在尝试使用CV进行图像处理,而你正在做的事情是CPU限制的(在运行时最大化处理器),那么并行化它对单个核心没有帮助(它们将相互竞争)对于CPU)。
如果您正在做的事情必须等待I / O完成,那么并行化它将允许一些工作继续进行而其他进程在I / O上等待。
这取决于你正在做什么 - 你应该关闭这个问题,并提出一个更具体的问题,详细说明你正在尝试做什么以及CPU任务的密集程度。
(顺便说一句,如果可以的话,使图像处理更快的一种方法是预先调整图像大小 - 你可能尝试用图像在较小版本上正常工作的许多事情 - 例如:面部检测)。