Parallel.For vs for

本文关键字:for vs For Parallel | 更新日期: 2023-09-27 18:16:10

我有一个并行。For和一个常规的For循环做一些简单的算术,只是为了测试并行。

我的结论是,在我的i5笔记本处理器上,常规的for更快。

这是我的代码

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;
        }
    }
}

这些是我的结果。重复后变化不大:

00:00:03.9062234
00:00:01.7971028
00:00:03.2231844
00:00:01.7781017

那么为什么要使用Parallel呢?div ?

并行处理有组织开销。想象一下,有100个任务,10个人去完成它们。有10个人为你工作是不容易的,除了真正完成100项任务外,还要组织谁做需要时间的事情。

所以,如果你想并行地做一些事情,确保它是如此多的工作,使得组织并行性的工作量与实际工作量相比是如此之小,以至于这样做是有意义的。

Parallel.For vs for

当人们第一次深入研究多线程时,最常犯的错误之一就是认为多线程是免费的午餐。

事实上,将操作分成多个较小的操作,然后并行运行,将会花费一些额外的时间。如果同步得不好,任务可能会花费更多的时间,等待其他任务释放锁。

作为结果;当每个任务只做很少的工作时,并行化是不值得花费时间和麻烦的,这就是OperationDoWork的情况。

<标题>编辑:

考虑试一下:

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

根据我的基准测试,for将平均为5.7秒,而Parallel.For将花费3.05秒在我的Core2Duo CPU上(加速== ~1.87)。
在我的四核i7上,for的平均速度为5.1秒,Parallel.For的平均速度为1.38秒(加速== ~3.7)。

修改后的代码可以很好地扩展到可用的物理内核数量。Q.E.D.