首页 > 解决方案 > 估计并行运行的任务的时间量

问题描述

我有一个项目列表,根据一些计算,每个项目都需要一定的时间,而要花费的时间是特定于项目的。括号中的数字是执行时每个项目将花费的时间。时间以秒为单位

例如。我有 5 件物品 - 物品 1 (2)、物品 2(1)、物品 3(4)、物品 4(3)、物品 5(2)。

我准备了一个由项目组成的列表,让我们说该列表称为 List1 并包含项目 - Item1、Item3、Item5。

现在这些项目基本上代表了某些操作,(请假设没有外部因素,如 I/O、处理器等影响这些项目/步骤)

foreach(var x in List1)
{
   // How to execute the items actually in Parallel 
}

问题1:如何真正确保这些项目并行运行。是否使用 TLP(任务并行库)选项,如果是,如何使用它。

问题2:现在在这种情况下,当它们实际并行运行时,是否可以肯定地说所花费的时间将是列表中项目的最大时间量。在这种情况下,4 秒,因为 Item3 在 List1 的所有项目中是最高的。

标签: .netconcurrencytasktask-parallel-library

解决方案


问题1:如何真正确保这些项目并行运行。是否使用 TLP(任务并行库)选项,如果是,如何使用它。

使用 TPL 将是最佳选择,但您的进程是否受 IO 限制或 CPU 限制确实很重要。简单来说,如果该过程纯粹是一个耗时的 CPU 操作,那么您将受到 CPU 限制,否则如果您正在执行 IO,那么您的 IO 受限。以下是每个示例:

public class IO_Item
{
    public Task Process() => Task.CompletedTask;
}

public Task ProcessAll_IOBound(IList<IO_Item> items)
{
    var tasks = items.Select(item => item.Process());
    return Task.WhenAll(tasks);
}

public class CPU_Item
{
    public void Process() { }
}

public void ProcessAll_CPUBound(IList<CPU_Item> items)
{
    Parallel.ForEach(items, item => item.Process());
}

问题2:现在在这种情况下,当它们实际并行运行时,是否可以肯定地说所花费的时间将是列表中项目的最大时间量。在这种情况下,4 秒,因为 Item3 在 List1 的所有项目中是最高的。

不必要。首先并行运行并不一定意味着同时运行所有项目。它们可能会被批处理、阻塞或以其他方式必须等待轮到它们运行,因此会增加总时间。此外,请记住并行操作并非没有开销。就性能而言,最好是分析一个真实的测试用例,看看数字告诉你什么。


推荐阅读