概要: System.Threading.Tasks.Parallel.ForEach と Concurrent Data 構造から単純な plinq (Parallel Linq) クエリに変更しました。スピードアップはすごかった。
plinq は本質的に Parallel.ForEach よりも速いのでしょうか? または、タスクに固有のものです。
// Original Code
// concurrent dictionary to store results
var resultDict = new ConcurrentDictionary<string, MyResultType>();
Parallel.ForEach(items, item =>
{
resultDict.TryAdd(item.Name, PerformWork(source));
});
// new code
var results =
items
.AsParallel()
.Select(item => new { item.Name, queryResult = PerformWork(item) })
.ToDictionary(kv => kv.SourceName, kv => kv.queryResult);
注: 各タスク (PerformWork) は 0 ~ 200 ミリ秒で実行されるようになりました。以前は最適化するまでに時間がかかりました。そのため、最初に Tasks.Parallel ライブラリを使用していました。そのため、合計時間は 2 秒から 100 ~ 200 ミリ秒になり、ほぼ同じ作業を別の方法で実行しました。(すごい linq と plinq は素晴らしいです!)
質問:
- plinq と Parallel.ForEach を使用することで速度が向上しますか?
- 代わりに、単に並行データ構造 (ConcurrentDictionary) を削除するだけですか? (スレッドを同期する必要がないため)。
- この関連する質問の回答に基づいて
PLINQ は主に、副作用のない関数型プログラミング スタイルに基づいていますが、副作用はまさに TPL の目的です。物事を並行して検索/選択するのではなく、実際に並行して作業を行いたい場合は、TPL を使用します。
私のパターンは基本的に機能しているため (入力を与えると、突然変異なしで新しい出力が生成される)、plinq が使用する正しいテクノロジであると仮定できますか?
私の仮定が正しいという検証、または何かが欠けているという兆候を探しています。