我有以下代碼(從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 非平行EL:0.0451731
並行:0.2155218 非平行:0.0450392
啓動線程也不是沒有成本 –
調試模式編譯?由於優化後的代碼什麼都不做,甚至可能會被優化。在決定哪一個更快的時候沒有意義:什麼也不做,或者什麼都不做。 –
線程非常昂貴;只有當你有大量的工作要做時才僱用員工纔有意義。 –