.net - 估计并行运行的任务的时间量
问题描述
我有一个项目列表,根据一些计算,每个项目都需要一定的时间,而要花费的时间是特定于项目的。括号中的数字是执行时每个项目将花费的时间。时间以秒为单位
例如。我有 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 的所有项目中是最高的。
解决方案
问题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 的所有项目中是最高的。
不必要。首先并行运行并不一定意味着同时运行所有项目。它们可能会被批处理、阻塞或以其他方式必须等待轮到它们运行,因此会增加总时间。此外,请记住并行操作并非没有开销。就性能而言,最好是分析一个真实的测试用例,看看数字告诉你什么。
推荐阅读
- python-3.x - 连接字符串的子列表介绍列表的字符串元素
- python - value_counts unstack 与其他类别
- amazon-web-services - 我可以通过 cloudformation 启用 Redshift 跨区域快照复制吗?
- postgresql - PostgreSQL中相关表的分区
- c# - Unity 自定义编辑器:使用 DrawRect 制作自定义选择框
- python - 在外部目录中查找类而不修改 sys.path
- google-sheets-formula - 用于在 Google 表格中查询的 ArrayFormula
- python - 从列表列表中提取值并添加到新列
- openlayers - 使用 ol-ext (openlayers ext) 渲染透视图时遇到问题
- centos7 - ValueError: 端口 tcp/8090 已定义