【发布时间】:2016-01-09 06:24:19
【问题描述】:
我有以下代码(从 LINQPad 复制到此处)。显然我不明白 TPL 是如何工作的,或者代码是垃圾,为什么并行版本的运行速度比非并行版本慢?
for (int i = 0; i < 100; i++)
{
ParallelOptions ops = new ParallelOptions();
ops.MaxDegreeOfParallelism = Environment.ProcessorCount;
var watch = Stopwatch.StartNew();
Parallel.ForEach<int>(Enumerable.Range(1, 10000000), ops, x => { int y = x + 1; });
watch.Stop();
Console.WriteLine("Parallel: {0}", watch.Elapsed.TotalSeconds);
watch = Stopwatch.StartNew();
foreach (var x in Enumerable.Range(1, 10000000))
{
int y = x + 1;
}
watch.Stop();
Console.WriteLine("Non-parallel: {0}\n", watch.Elapsed.TotalSeconds);
}
前 10 个结果:
平行:0.1991644 非平行:0.0466178
平行:0.1723428 非平行:0.0447134
平行:0.1141791 非平行:0.0444557
平行:0.1758878 非平行:0.0444636
平行:0.1687637 非平行:0.0444338
平行:0.1677679 非平行:0.0445771
平行:0.1191462 非平行:0.0446116
平行:0.1702483 非平行:0.0454863
平行:0.1143605 非平行:0.0451731
平行:0.2155218 非平行:0.0450392
【问题讨论】:
-
启动线程并非没有成本
-
调试模式编译?因为当优化时,代码什么都不做,甚至可能被优化掉。确定哪个更快没有意义:什么都不做或启动线程什么都不做。
-
线程非常昂贵;只有当您有大量工作要做时,雇用工人才有意义。
-
看看这个SO link接受的答案
标签: c# parallel-processing task-parallel-library task