通过将长时间运行的任务分解为单独的进程来提高程序性能

问题描述:

我读过,当您在单独的线程(并行)中运行长时间运行的操作时,当您的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

多线程不仅仅是为了利用多个内核。根据应用程序及其线程的作用,运行在单个内核计算机上的多线程应用程序可能仍然比运行在单个内核上的单线程应用程序更具性能。 多进程的一大缺点是它们不能共享内存或资源,而多线程的单进程可以。 – RavB

+0

您的进程不受CPU限制 - 大部分时间只是休眠。什么会提高性能?它仍然会睡200毫秒100次,并且几乎同时进行。写入将全部采用相同的时间。 –

+1

@RavB *有很多原因可以在只有单核的机器上使用多线程(毕竟,线程已经被普遍使用了几十年,而多核心的计算机只在一个十年内普遍使用)但这些原因不是表现。在单核心机器上,多线程代码总是会少*性能(因为你完成了相同的工作,但是具有线程开销),但是尽管存在线程开销,它仍然可以是有用的。 – Servy

你应该尝试它检查自己,但是......

是否有提高长期运行的任务性能,即使只有一个核心的方法吗?

是的,但显然不是通过并行运行。你可以在代码中使用性能分析器来找出哪些部分花费的时间最多,并尝试以更优化的方式重写它。

编辑基于评论:

如果你正在尝试做的图像处理与CV和你正在做的事情是CPU绑定(马克塞斯同时运行的处理器),然后并行它是不会以帮助单核(他们将相互竞争CPU)。

如果你正在做的事情必须等待I/O完成,那么并行化它将允许一些工作继续进行,而其他进程则等待I/O。

这取决于你在做什么 - 你应该关闭这个问题并且询问一个更具体的问题,详细说明你想要做什么以及这个任务的CPU密集程度如何。 (顺便说一句,如果可以的话,一种使图像处理更快的方法是事先调整图像的大小 - 你可能试图用图像处理较小版本的很多事情 - 例如:人脸检测)。

+0

问题是,它不是我写的代码,需要很长时间才能完成,它是 - EmguCV图像计算算法。 – Edgar

+0

它需要花费时间(同时,它很可能会尽可能快地完成任务 - 简历写得很好)。 –