3

並列ループで呼び出したチャートをロードする際のパフォーマンスを向上させるために、並列ループを使用しています。

Load Chartメソッドには大きなコードがあり、並列実行したいのですが、実行していると、並列実行と順次実行の違いがわかりません。

並列プロセスと順次プロセスの実行に同じ時間がかかります。

私の並列ループコードは以下の通りです。

List<Chart> lstCharts = new List<Chart>();
        Parallel.For(0, givenSampleArray.Length, i =>
            {
                Chart NewChart = new Chart();

                objChart.LoadChart(ref NewChart, givenSampleArray[i], YAxisTable, XPointsValues,
                                   ScaleMinValue, ScaleMaxValue, ref dtNewRowsContainer,
                                   dtExcelData); 
                NewChart.Tag = (i + 1).ToString();
                NewChart.Width = (pnlChart.Width * 49) / (100);


                Legend legend = AddLegend();
                NewChart.Legends.Add(legend);

                lstCharts.Add(NewChart);
            }
        );
4

1 に答える 1

17

あなたの質問には質問がないことに注意してください。

並列化してもプログラムが速くならないのはなぜですか?

9 人の女性が集まって 1 か月で赤ちゃんを作ることはできません。一部の操作は、並列化しても速度が上がりません。これはそれらの1つです。

並列化によって効率的に解決できる問題の特徴は何ですか?

並列化すると高速化する操作には、(1) 問題を必要な数の部分に簡単に分割できる、(2) 小さい問題を互いに独立して正しく解決できる、(3) 解決策があるという特性があります。より小さな問題への解決策は、より大きな問題への解決策に安価に組み合わせることができます。

たとえば、物理シミュレーションの計算とフラクタル イメージの計算を比較します。多くの相互作用する物体のシミュレーションは、すべての部分が相互作用するため、サブ問題に分解するのが困難です。しかし、フラクタルの最初の 1000 ピクセルは、2 番目の 1000 ピクセルと相互作用しません。フラクタル計算は簡単に並列化できます。物理シミュレーションは、並列化がはるかに困難です。(もちろんできますが、簡単ではありません。)

解決すべき「恥ずかしいほど並列」な問題があるとします。10 スレッドにすると 10 倍速くなりますか?

いいえ。最初に、ジョブを並列化するときにジョブを高速化する場合は、プロセッサを飽和させる必要があります。プロセッサが 4 つしかない場合、10 個のスレッドによってプログラムが遅くなりますが、速くはなりません。第二に、スレッドの作成と管理にはコストがかかり、そのコストは収益から生じます。

スレッドをドライバー、プロセッサーを自動車と考えてください。配送する荷物が 1,000 個、車が 1 台、ドライバーが 1 人の場合、おそらく 100 時間かかります。別のドライバーを雇った場合、ドライバーにお金を費やしたことになりますが、追加の車がなければ、それ以上速くなることはありません。遅くなります。車を 4 台購入すると、それぞれ 250 個の荷物を配達する 4 人のドライバーが必要になります。25時間かかりますか?さて、それらのドライバーを雇うのにどのくらいかかりましたか? スレッドの割り当ては安くはありません。時間がかかり、それを考慮する必要があります。

そして、100 個の荷物を担当する 10 人のドライバーが 4 台の車を共有するのは絶対に避けたいことです。少なくとも 6 人のドライバーが車が空くのを待っているにもかかわらず、10 人のドライバー全員に料金を支払うことになるため、それだけでは時間がかかり、費用が高くなります。

要約: 簡単に並列化できる問題でプロセッサが飽和状態になる場合を除き、並列化を試みないでください。ジョブはスレッドの作成よりもはるかに高価であり、プロセッサよりも多くのスレッドが存在しないようにしてください。スレッドの代わりにタスクを使用するのが理想的です。Task Parallel Library は、スケジュールするスレッドの数を計算する作業を行うように設計されています。

于 2013-01-31T05:53:44.917 に答える