为什么C#任务并行库代码比正常的循环慢?

时间:2014-12-27 21:27:52

标签: c# performance task-parallel-library

我想知道为什么并行代码并不比使用此代码的普通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);
    }
}

1 个答案:

答案 0 :(得分:1)

要获得更准确的结果,请在两个循环中删除对Console.WriteLine的调用。由于问题评论中陈述的原因,您仍会看到并行循环较慢。

为了更好地理解为什么,请使用here中的Parallel.For重载并将属性ParallelOptions.MaxDegreeOfParallelism设置为4(允许最多4个并发操作)或-1 (没有限制)并且并行for循环比预期慢,因为线程处理开销。现在将ParallelOptions.MaxDegreeOfParallelism设置为1,这意味着只有一个线程将处理循环操作。现在应该导致类似的时间吗?

现在结果更接近,但并行循环仍然更慢。它是,我认为,因为并行循环仍然必须处理线程并以某种方式与TaskScheduler交互,而普通循环根本不会。

我希望这个答案可以为你提供更多见解。