5

ここ数日、並列処理について少し学んでいて、この例に出くわしました。

次のような順次 for ループを並べて配置します。

private static void NoParallelTest()
{
    int[] nums = Enumerable.Range(0, 1000000).ToArray();
    long total = 0;
    var watch = Stopwatch.StartNew();
    for (int i = 0; i < nums.Length; i++)
    {
        total += nums[i];
    }
    Console.WriteLine("NoParallel");
    Console.WriteLine(watch.ElapsedMilliseconds);
    Console.WriteLine("The total is {0}", total);
}

NoParallel メソッドが、サイトで提供されている並列の例よりもはるかに速く終了したことに驚きました。

私はi5 PCを持っています。

パラレル方式の方が早く終わると本気で思っていました。

これについて合理的な説明はありますか?多分私は何かを誤解しましたか?

4

2 に答える 2

12

この例では、各反復で操作を実行するのに費やされる時間が非常に短く、複数のスレッドの作成と管理にかなりのオーバーヘッドが伴うため、順次バージョンの方が高速でした。

並列プログラミングは、各反復がプロセッサ時間の点で十分に高価な場合にのみ効率を向上させます。

于 2012-05-02T14:15:15.210 に答える
2

これは、ループが非常に単純で非常に高速な操作を実行するためだと思います。

非並列版の場合はそれだけです。ただし、並列バージョンではデリゲートを呼び出す必要があります。デリゲートの呼び出しは非常に高速であり、通常、その頻度を気にする必要はありません。しかし、この極端なケースでは、それが違いを生むのです。デリゲートの呼び出しは、配列から数値を追加するよりも、たとえば 10 倍 (またはそれ以上、正確な比率はわかりません) 遅くなることは容易に想像できます。

于 2012-05-02T14:11:48.697 に答える