为什么Parallel.ForEach比顺序循环慢两倍

本文关键字:两倍 循环 Parallel ForEach 顺序 为什么 | 更新日期: 2023-09-27 18:24:00

为什么下面的indexed parallel.foreach与正常的顺序循环相比几乎慢两倍?它与资源争用有关吗?

static void Main(string[] args)
{
    var values = Enumerable.Range(0, 100000).Select(v => v+v);
    Stopwatch s = Stopwatch.StartNew();
    //int index = 0;
    //foreach (double value in values)
    //{
    //    Console.WriteLine("{0}:'t{1}", index, value);
    //    index++;
    //}
    Parallel.ForEach(values, (value, pls, index) =>
    {
        Console.WriteLine("{0}:'t{1}", index, value);
        index++;
    });
    Console.WriteLine(s.Elapsed.TotalMilliseconds);
    Console.ReadLine();
}

为什么Parallel.ForEach比顺序循环慢两倍

Console实际上一次只能执行一个Write,因此您的第二个版本需要花费大量时间创建多个线程,为每个线程安排工作,然后让除一个线程外的所有线程坐在那里等待其他线程,直到它们全部完成。你得到了多线程的所有开销,却没有任何好处,因为你实际上并不是并行地做任何工作。