エンジニアの備忘録

エンジニアの私が備忘録や思ったことをちょいちょい書いてます。

C#でParallelの処理速度比較(for, foreach, AsParallel(), AsParallel().ForAll(), Parallel.ForEach())

C#でParallel処理、ループ文を行うと思います。
その時の処理速度気になりますよね。
実際にやってみた結果は下になります。

処理内容

20回重たい処理を実行

for : 2.1843秒

for (int i = 0; i < _num.Count(); i++) {
    Processing(i);
}

foreach : 2.1337秒

foreach (var i in _num) {
    Processing(i);
}

AsParallel() : 2.0763秒

foreach (var i in _num.AsParallel()) {
    Processing(i);
}

AsParallel().ForAll() : 0.4865秒

_num.AsParallel().ForAll(i => {
    Processing(i);
});

Parallel.ForEach() : 0.3333秒

Parallel.ForEach(_num, i => {
    Processing(i);
});

全コード

public static class ParallelSpeed
{
    private static IEnumerable<int> _num = Enumerable.Range(0, 20);
    private static Stopwatch _sw;

    public static void Check()
    {
        _sw = Stopwatch.StartNew();
        //for
        for (int i = 0; i < _num.Count(); i++) {
            Processing(i);
        }
        Console.WriteLine("for : " + _sw.Elapsed);

        _sw = Stopwatch.StartNew();
        //foreach
        foreach (var i in _num) {
            Processing(i);
        }
        Console.WriteLine("foreach : "+_sw.Elapsed);

        _sw = Stopwatch.StartNew();
        //AsParallel()
        foreach (var i in _num.AsParallel()) {
            Processing(i);
        }
        Console.WriteLine("AsParallel() : " + _sw.Elapsed);

        _sw = Stopwatch.StartNew();
        //AsParallel.ForAll()
        _num.AsParallel().ForAll(i => {
            Processing(i);
        });
        Console.WriteLine("AsParallel().ForAll() : " + _sw.Elapsed);

        _sw = Stopwatch.StartNew();
        //Parallel.ForEach()
        Parallel.ForEach(_num, i => {
            Processing(i);
        });
        Console.WriteLine("Parallel.ForEach() : " + _sw.Elapsed);
    }

    //重たい処理
    private static void Processing(int i)
    {
        Thread.Sleep(100);
    }
}