gpt4 book ai didi

c#-4.0 - C# : AsParallel - does order matter?

转载 作者:行者123 更新时间:2023-12-03 20:17:13 24 4
gpt4 key购买 nike

我正在构建一个简单的 LinQ 到对象查询,我想对其进行并行化,但是我想知道语句的顺序是否重要?

例如

IList<RepeaterItem> items;

var result = items
.Select(item => item.FindControl("somecontrol"))
.Where(ctrl => SomeCheck(ctrl))
.AsParallel();

对比
var result = items
.AsParallel()
.Select(item => item.FindControl("somecontrol"))
.Where(ctrl => SomeCheck(ctrl));

会有什么区别吗?

最佳答案

绝对地。在第一种情况下,投影和过滤将串联完成,然后才将任何东西并行化。

在第二种情况下,投影和过滤将并行发生。

除非您有特殊原因使用第一个版本(例如,投影具有线程关联性或其他一些奇怪的东西),否则您应该使用第二个版本。

编辑:这是一些测试代码。与许多基准测试一样有缺陷,但结果是合理的结论:

using System;
using System.Diagnostics;
using System.Linq;
using System.Threading;

class Test
{
static void Main()
{
var query = Enumerable.Range(0, 1000)
.Select(SlowProjection)
.Where(x => x > 10)
.AsParallel();
Stopwatch sw = Stopwatch.StartNew();
int count = query.Count();
sw.Stop();
Console.WriteLine("Count: {0} in {1}ms", count,
sw.ElapsedMilliseconds);

query = Enumerable.Range(0, 1000)
.AsParallel()
.Select(SlowProjection)
.Where(x => x > 10);
sw = Stopwatch.StartNew();
count = query.Count();
sw.Stop();
Console.WriteLine("Count: {0} in {1}ms", count,
sw.ElapsedMilliseconds);
}

static int SlowProjection(int input)
{
Thread.Sleep(100);
return input;
}
}

结果:
Count: 989 in 100183ms
Count: 989 in 13626ms

现在 PFX 中有很多启发式的东西,但很明显第一个结果根本没有被并行化,而第二个结果是。

关于c#-4.0 - C# : AsParallel - does order matter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5014460/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com