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

问题描述 投票:0回答:1

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

c# multithreading performance process parallel-processing
1个回答
1
投票

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

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

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

根据评论编辑:

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.