.NET Coreでは、並列プログラミングをサポートする機能が標準で提供されています。この記事では、C#を使った並列ループ、特にParallel.ForEach
とParallel.For
メソッドを使用したプログラムの作成方法を解説します。
目次
並列プログラミングとは?
並列プログラミングは、複数のタスクが同時に実行されることで、パフォーマンスやレスポンス時間を改善する技術です。C#の.NET Coreでは、System.Threading.Tasks
名前空間のParallel
クラスを使用して簡単に並列ループを実装できます。
Parallel.ForEachの使い方
Parallel.ForEach
は、コレクションの各要素を並列で処理するために使用されます。
Parallel.ForEachの例
以下は、文字列のリストを並列に処理する例です。
using System; using System.Collections.Generic; using System.Threading.Tasks; namespace ParallelLoops { class Program { static void Main(string[] args) { List<string> names = new List<string> { "Alice", "Bob", "Carol", "David", "Eve" }; Parallel.ForEach(names, name => { Console.WriteLine($"Processing: {name}"); }); } } }
Parallel.Forの使い方
Parallel.For
は、一定範囲のインデックスを並列で処理するために使用されます。
Parallel.Forの例
以下は、1から10までの数値を並列で処理する例です。
using System; using System.Threading.Tasks; namespace ParallelLoops { class Program { static void Main(string[] args) { int start = 1; int end = 10; Parallel.For(start, end + 1, i => { Console.WriteLine($"Processing number: {i}"); }); } } }
注意点と最適化
- 並列ループの使用に伴い、スレッドセーフな操作を行う必要があります。
- 順序に依存しない処理が適しており、順序が重要な場合は並列化の検討が必要です。
- 短時間で完了するループの並列化は、パフォーマンス低下の原因になることがあります。
最適化の例
以下は、辞書(ディクショナリ)の操作をスレッドセーフに行う例です。
using System; using System.Collections.Concurrent; using System.Threading.Tasks; namespace ParallelLoops { class Program { static void Main(string[] args) { int[] numbers = new int[] { 1, 2, 3, 4, 5 }; var results = new ConcurrentDictionary<int, long>(); Parallel.ForEach(numbers, number => { results[number] = Factorial(number); }); foreach (var result in results) { Console.WriteLine($"Factorial of {result.Key} is {result.Value}"); } } static long Factorial(int number) { if (number <= 1) return 1; return number * Factorial(number - 1); } } }
まとめ
C#の.NET Coreでは、Parallel.ForEach
とParallel.For
を使用して簡単に並列ループを実装でき、パフォーマンス向上やレスポンス時間の短縮が期待できます。ただし、スレッドセーフな操作や適切な処理の順序を考慮する必要があります。並列ループの最適化に慣れることで、アプリケーションのパフォーマンスを効果的に向上させることができるでしょう。