我已经读过,当你在不同的线程(并行)中运行长时间运行的操作时,当你的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图像计算算法。
答案 0 :(得分:1)
你应该通过尝试来检查自己,但是......
即使只有一个核心,有没有办法改善长时间运行的任务性能?
是的,但显然不是通过并行运行它。您可以在代码上使用性能分析器来找出哪些部分花费的时间最多,并尝试以更优化的方式重写它。
根据评论编辑:
如果你正在尝试使用CV进行图像处理,而你正在做的事情是CPU限制的(在运行时最大化处理器),那么并行化它对单个核心没有帮助(它们将竞争彼此为CPU)。
如果您正在做的事情必须等待I / O完成,那么并行化将允许一些工作继续进行而其他进程在I / O上等待。
这取决于你正在做什么 - 你应该关闭这个问题,然后问一个更具体的问题,详细说明你正在尝试做什么,以及CPU密集程度如何。
(顺便说一句,如果可以的话,一种使图像处理更快的方法是预先调整图像大小 - 你可能尝试用图像在较小版本上正常工作的许多事情 - 例如:面部检测)