【发布时间】:2017-03-05 11:04:26
【问题描述】:
问题
在 LINQ 查询中,我可以正确地(如:编译器不会抱怨)像这样调用 .AsParallel():
(from l in list.AsParallel() where <some_clause> select l).ToList();
或者像这样:
(from l in list where <some_clause> select l).AsParallel().ToList();
到底有什么区别?
我尝试过的
从official documentation 来看,我几乎总是看到使用的第一种方法,所以我认为这是要走的路。
今天,我尝试自己运行一些基准测试,结果令人惊讶。这是我运行的代码:
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}");
输出
在 49 之前调用 .AsParallel()
在 4 之后调用 .AsParallel()
因此,显然,尽管文档中说了什么,第二种方法要快得多。这里到底发生了什么?
【问题讨论】:
-
你的机器是单核还是多核?
-
@viveknuna 多核
-
每次都会给你不同的结果
-
@viveknuna 是的,但区别总是一样的
标签: c# linq parallel-processing plinq