微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Parallel.ForEach 和条件与 .NET 中的正常循环

如何解决Parallel.ForEach 和条件与 .NET 中的正常循环

下面是否会在 5 处对 500 个项目进行并行处理,但对 1 个项目进行正常循环(没有性能影响)。我不希望在一次执行 1 项时使用 Parallel 的性能受到影响(如果有)。

 Parallel.ForEach(scheduledMatchups,new ParallelOptions
            {
                MaxDegreeOfParallelism = scheduledMatchups.Count() > 500 ? 5 : 1
            },gridItem =>
            {
// Process
});

解决方法

您可以重构操作和循环序列以具有两个不同的执行路径,同时仍然只定义要执行一次的操作

import math

def uppertri(n):
    #dis = math.sqrt(1 + 8 * n)
    #m = math.ceil((dis-1)/2)
    #better variant proposed by Mark Dickinson (for Python 3.8+)
    m = (math.isqrt(8*n) + 1) // 2
    return m*(m+1)//2

for i in range(1,30):
    uppertri(i)
    print(i,uppertri(i),end = "; ")

1 1; 2 3; 3 3; 4 6; 5 6; 6 6; 7 10; 8 10; 9 10; 10 10; 11 15; 12 15; 13 15; 14 15; 
15 15; 16 21; 17 21; 18 21; 19 21; 20 21; 21 21; 22 28; 23 28; 24 28; 25 28; 26 28;
27 28; 28 28; 29 36; 

This answer on SO 提供了一些关于 Action<GridItems> action = (gridItem) => { // Process }; if (scheduledMatchups.Count < 500) { scheduledMatchups.ForEach(action); // or for more control,you could iterate yourself // with a for or foreach and call the action() manually. // // foreach(var gridItem in scheduledMatchups) action(gridItem); } else { Parallel.ForEach(scheduledMatchups,new ParallelOptions { MaxDegreeOfParallelism = 5 },action); } 内部正在发生的事情的见解,如果您追求对性能和实现的最终控制,那么这个简单的分支逻辑仍然只定义一次操作-可用的方式。

虽然从技术上讲存在开销,但如果您通常期望满足并行条件,那么开销通常不足以证明这种类型的工作只是为了它。

正如@Keith 在下面的评论中指出的那样,Parallel.ForEach 不会,也不会为“迭代次数有限的小循环体”提供性能改进。 This is covered in this article on concurrency and parallel programming.

如果您的动作的权重足够轻,那么即使进行了多次迭代,您最好不要完全并行处理。


我发现只有当您可以证明它适合您正在执行的操作类型时,才使用 Parallel.ForEach 通常是更好的练习。如果操作本身需要一些可观察的时间来处理,那么对于有限数量的操作,开销很可能是合理的。

与所有此类问题一样,您的情况的真正答案总是取决于比此处记录的实际情况多得多的因素,因此您应该尝试两种风格的代码,并自行确定是否会产生影响方式是显着的或可以接受的。

如果您以一种或另一种方式观察问题,请发布有关具体观察结果的信息。在选择并行或不并行时,您应该警惕流程的过度过早优化,这最终会使您的代码更难阅读或维护,但对流程的改进却很少或没有改进。实际运行时间。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。