会社の人にParallelクラスの存在を教えてもらったのでメモ。
.NET Framework 4で追加されたかなり前から存在する機能なのでありふれた内容です。
概要
Parallelクラスを利用することでループ内を手軽に並列化できる。
メリット
- 通常のfor, foreachと書き方が殆ど変わらない点が非常にお手軽。
- Thread, Task, await, asyncを使わずに並列処理を実現できる。
注意点
当然ではあるが並列処理なので同じファイルへのアクセスなどは気をつける必要がある。Lockをかけるとか。
通常のforeach
List<int> list = new List<int>()
{
1, 2, 3, 4, 5, 6, 7, 8, 9
};
foreach (int value in list)
{
Console.Write(value);
}
実行結果
123456789
逐次処理なので1~9まで順番にコンソール出力されます。
Parallel.ForEachで並列化
List<int> list = new List<int>()
{
1, 2, 3, 4, 5, 6, 7, 8, 9
};
// 並列処理オプションの設定
ParallelOptions parallelOptions = new ParallelOptions();
parallelOptions.MaxDegreeOfParallelism = 4;
// 並列処理実行
Parallel.ForEach(list, parallelOptions, (value) =>
{
Console.Write(value);
});
実行結果
156894723
並列処理なので実行毎に結果が変わります。
順番を気にする必要のない処理であれば非常に手軽に高速化できます。
「MaxDegreeOfParallelism」の設定は実行環境のCPU性能や負荷状況による。
今のコンシューマ向けCPUなら4で良いと思う。
あとがき
お手軽すぎる。C#好き。