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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过将长时间运行的任务分成单独的进程来提高程序性能相关的知识,希望对你有一定的参考价值。

我已经读过,当你在不同的线程(并行)中运行长时间运行的操作时,当你的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任务的密集程度。

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

以上是关于通过将长时间运行的任务分成单独的进程来提高程序性能的主要内容,如果未能解决你的问题,请参考以下文章

气流将长时间运行的任务标记为失败

如何使用气流检查长时间运行的 http 任务的状态?

分析非常长时间运行的任务

具有长时间运行任务的单独线程中的计时器

在 iOS 中实现长时间运行的后台任务

延迟长时间运行的计时器任务以提高滚动平滑度