问题
在LINQ查询中,我可以正确地(编译器不会抱怨)这样调用.AsParallel():
(from l in list.AsParallel() where <some_clause> select l).ToList();
或者像这样:
(from l in list where <some_clause> select l).AsParallel().ToList();
这两种方法有什么具体的区别?
我尝试过的
从官方文档来看,我几乎总是看到第一种方法被使用,因此我认为那是可行的方法。
然而今天,我尝试了一些基准测试,结果出人意料。这是我运行的代码:
var list = new List<int>();
var rand = new Random();
for (int i = 0; i < 100000; i++)
list.Add(rand.Next());
var treshold= 1497234;
var sw = new Stopwatch();
sw.Restart();
var result = (from l in list.AsParallel() where l > treshold select l).ToList();
sw.Stop();
Console.WriteLine($"call .AsParallel() before: {sw.ElapsedMilliseconds}");
sw.Restart();
result = (from l in list where l > treshold select l).AsParallel().ToList();
sw.Stop();
Console.WriteLine($"call .AsParallel() after: {sw.ElapsedMilliseconds}");
输出
在调用.AsParallel()之前:49
在调用.AsParallel()之后:4
很明显,尽管文档中写的不一样,第二个方法要快得多。那么这里到底发生了什么?