4

我有一个 Parallel.For 和一个常规 for 循环做一些简单的算术,只是为了对 Parallel.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.For 呢?

4

2 回答 2

10

并行处理具有组织开销。把它想象成有 100 个任务和 10 个人来完成它们。让 10 个人为你工作并不容易,除了实际完成 100 项任务之外,只需组织谁来做那些花费时间的事情。

因此,如果您想并行执行某些操作,请确保工作量如此之大,以至于组织并行性的工作量与实际工作量相比是如此之小,以至于这样做是有意义的。

于 2013-05-31T12:15:22.583 回答
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);
    }

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

这个修改后的代码可以很好地适应可用物理内核的数量。量子点

于 2013-05-31T12:14:58.613 回答