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

时间:2017-12-27 16:13:03

标签: c# multithreading performance process parallel-processing

我已经读过,当你在不同的线程(并行)中运行长时间运行的操作时,当你的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图像计算算法。

1 个答案:

答案 0 :(得分:1)

你应该通过尝试来检查自己,但是......

  

即使只有一个核心,有没有办法改善长时间运行的任务性能?

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

根据评论编辑:

如果你正在尝试使用CV进行图像处理,而你正在做的事情是CPU限制的(在运行时最大化处理器),那么并行化它对单个核心没有帮助(它们将竞争彼此为CPU)。

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

这取决于你正在做什么 - 你应该关闭这个问题,然后问一个更具体的问题,详细说明你正在尝试做什么,以及CPU密集程度如何。

(顺便说一句,如果可以的话,一种使图像处理更快的方法是预先调整图像大小 - 你可能尝试用图像在较小版本上正常工作的许多事情 - 例如:面部检测)