4

Parallel.For と、Parallel.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.For を使用するのでしょうか。

4

2 に答える 2

10

並列処理には組織のオーバーヘッドがあります。100 のタスクと 10 人がそれを実行するという観点から考えてみてください。100 人のタスクを実際に実行するだけでなく、誰が何をして時間を費やすかを整理するだけで、10 人で作業するのは簡単ではありません。

したがって、何かを並行して実行したい場合は、並列処理を構成するワークロードが実際のワークロードと比較して非常に小さいため、それを実行するのが理にかなっていることを確認ください。

于 2013-05-31T12:15:22.583 に答える
7

最初にマルチスレッドを掘り下げたときに犯す最も一般的な間違いの 1 つは、マルチスレッドはただの昼食であるという思い込みです。

実際には、操作を複数の小さな操作に分割して並列実行できるようにするには、余分な時間がかかります。同期が不十分な場合、タスクは他のタスクがロックを解放するのを待って、さらに多くの時間を費やしている可能性があります。

結果として; の場合のように、各タスクがほとんど作業を行わない場合、並列化は時間/トラブルの価値がありません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 秒、 (speedup == ~3.7)forで平均 1.38 秒です。Parallel.For

この変更されたコードは、利用可能な物理コアの数に非常によく対応します。QED

于 2013-05-31T12:14:58.613 に答える