Parallel Loops C#, .NET Core

.NET Coreでは、並列プログラミングをサポートする機能が標準で提供されています。この記事では、C#を使った並列ループ、特にParallel.ForEachParallel.Forメソッドを使用したプログラムの作成方法を解説します。

目次

  1. 並列プログラミングとは?
  2. Parallel.ForEachの使い方
  3. Parallel.Forの使い方
  4. 注意点と最適化
  5. まとめ

並列プログラミングとは?

並列プログラミングは、複数のタスクが同時に実行されることで、パフォーマンスやレスポンス時間を改善する技術です。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.ForEachParallel.Forを使用して簡単に並列ループを実装でき、パフォーマンス向上やレスポンス時間の短縮が期待できます。ただし、スレッドセーフな操作や適切な処理の順序を考慮する必要があります。並列ループの最適化に慣れることで、アプリケーションのパフォーマンスを効果的に向上させることができるでしょう。