我想知道为什么并行代码并不比使用此代码的普通for
循环快:
class MainClass
{
public static int count = 0;
public static void Main (string[] args)
{
int range = 1000000;
Stopwatch sp = new Stopwatch ();
sp.Start ();
Parallel.For (0, range, (i) => {
count = count + i;
Console.WriteLine ("Current sum is " + count);
});
sp.Stop ();
Console.WriteLine ("time to add was " + sp.ElapsedMilliseconds);
Console.ReadLine ();
Stopwatch s = new Stopwatch ();
s.Start ();
for (int i = 0; i < range; i++) {
count = count + i;
Console.WriteLine ("Current sum is " + count);
}
s.Stop ();
Console.WriteLine ("time to add was " + s.ElapsedMilliseconds);
}
}
答案 0 :(得分:1)
要获得更准确的结果,请在两个循环中删除对Console.WriteLine
的调用。由于问题评论中陈述的原因,您仍会看到并行循环较慢。
为了更好地理解为什么,请使用here中的Parallel.For
重载并将属性ParallelOptions.MaxDegreeOfParallelism
设置为4(允许最多4个并发操作)或-1 (没有限制)并且并行for循环比预期慢,因为线程处理开销。现在将ParallelOptions.MaxDegreeOfParallelism
设置为1,这意味着只有一个线程将处理循环操作。现在应该导致类似的时间吗?
现在结果更接近,但并行循环仍然更慢。它是,我认为,因为并行循环仍然必须处理线程并以某种方式与TaskScheduler
交互,而普通循环根本不会。
我希望这个答案可以为你提供更多见解。