Parallel.For vs for

Mik*_*erk 4 c# parallel-processing for-loop

我有一个Parallel.For和一个常规for循环做一些简单的算术,只是为了对Parallel.For进行基准测试

我的结论是,我的i5笔记本处理器上的常规速度更快.

这是我的代码

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int Iterations = int.MaxValue / 1000;
            DateTime StartTime = DateTime.MinValue;
            DateTime EndTime = DateTime.MinValue;

            StartTime = DateTime.Now;
            Parallel.For(0, Iterations, i =>
            {
                OperationDoWork(i);
            });
            EndTime = DateTime.Now;
            Console.WriteLine(EndTime.Subtract(StartTime).ToString());

            StartTime = DateTime.Now;
            for (int i = 0; i < Iterations; i++)
            {
                OperationDoWork(i);
            }
            EndTime = DateTime.Now;
            Console.WriteLine(EndTime.Subtract(StartTime).ToString());

            StartTime = DateTime.Now;
            Parallel.For(0, Iterations, i =>
            {
                OperationDoWork(i);
            });
            EndTime = DateTime.Now;
            Console.WriteLine(EndTime.Subtract(StartTime).ToString());

            StartTime = DateTime.Now;
            for (int i = 0; i < Iterations; i++)
            {
                OperationDoWork(i);
            }
            EndTime = DateTime.Now;
            Console.WriteLine(EndTime.Subtract(StartTime).ToString());
        }

        private static void OperationDoWork(int i)
        {
            int a = 0;
            a += i;
            i = a;
            a *= 2;
            a = a * a;
            a = i;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这些是我的结果.哪个重复不会改变太多:

00:00:03.9062234
00:00:01.7971028
00:00:03.2231844
00:00:01.7781017
Run Code Online (Sandbox Code Playgroud)

那么为什么要使用Parallel.For?

nvo*_*igt 9

并行处理具有组织开销.从拥有100个任务和10个人的角度来考虑它.让10个人为你工作并不容易,只是组织除了实际执行 100个任务之外还要花费多少时间.

因此,如果您想要并行执行某些操作,请确保组织并行操作的工作量与实际工作负载相比是如此之小,以至于它是有意义的.

  • 非常好的解释."我自己做得更快!" 可能是每个人至少有一次"团队合作"的经历. (2认同)

Nol*_*nar 7

在第一次深入研究多线程时,最常见的错误之一是多线程是免费午餐.

事实上,将您的操作拆分为多个较小的操作(然后可以并行运行)将需要一些额外的时间.如果严重同步,您的任务可能会花费更多时间,等待其他任务释放锁定.

结果是; 并行化不值得花时间/麻烦,当每个任务都要做很少的工作时,就是这样OperationDoWork.

编辑:

考虑尝试这个:

    private static void OperationDoWork(int i)
    {
        double a = 101.1D * i;
        for (int k = 0; k < 100; k++)
            a = Math.Pow(a, a);
    }
Run Code Online (Sandbox Code Playgroud)

根据我的基准测试,for平均为5.7秒,而Parallel.For我的Core2Duo CPU需要3.05秒(加速== ~1.87).
在我的Quadcore i7上,我的平均时间为5.1秒for,平均为1.38秒Parallel.For(加速= = ~3.7).

此修改后的代码可以很好地扩展到可用的物理内核数量.QED