2012-05-02 18 views
5

私はここ数日で並列性について少し学びました。そして、私はthisの例に出くわしました。この例では、パラレルバージョンがシーケンシャルバージョンより遅いのはなぜですか?

私はそれをこのようなループのシーケンシャルで左右に置く:私はNOPARALLEL方法がサイトで与えられたパラレル例より道道速く終了したことを見て驚きました

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

を。

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

私は実際にParallelメソッドがより速く終了すると考えました。

これについて合理的な説明はありますか?たぶん私は何かを誤解したでしょうか?

+1

誤解あなたはパラレルバージョンは、実際に複数のコア上で実行されたことを確認することができますか?反復回数を増やすと(大きな「Range」)何が起こりますか? – chrisaycock

+6

並列バージョンが複数のコアで動作していたと仮定すると、スレッド同期がどのくらいのオーバーヘッドをかけることができるかを簡単に示すことができます。 – Oded

+0

Mark Twainの言い換えをする。 *「嘘、嘘つき、統計、ベンチマークがある」* –

答えて

10

例の各繰り返しで操作を実行する時間が非常に少なく、複数のスレッドの作成と管理にかなりのオーバーヘッドが発生するため、シーケンシャルバージョンの方が高速でした。

並列プログラミングは、各反復がプロセッサ時間に関して十分に高価である場合にのみ効率を上げます。

2

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

非並行バージョンの場合はすべてそうです。しかし、パラレルバージョンはデリゲートを呼び出さなければなりません。デリゲートを呼び出すのは非常に高速で、通常は頻繁に行うことを心配する必要はありません。しかし、この極端なケースでは、それが違いを生むのです。デリゲートを呼び出すと、配列から数値を追加するよりも、例えば10倍遅くなる(またはそれ以上、正確な比率が何であるかわかりません)と簡単に想像できます。

2

リンゴとオレンジを比較していません。あなたがにリンク

の例では、それは異なるスレッド amoung共有されてから状態を切断する程度である限りとして並列処理や並行処理に関するものではありません。 の仕事は、何かが行われていることをちょうど示すためにストローマンです。

だから、比較するのは、F1カーとトップ燃料ドラッグスターを比較するのと同じです。それぞれがが速いで優秀ですが、速いは、の文脈に関連しており、これは多くの場合非常に特化しています。どちらも他の高度に専門化されたbailiwickで競争することはできません。

レッスン

  • 同時を学ぶ!=速く
  • 悪い考えベンチマークは
関連する問題