酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Windowsストアアプリでシステムに最適な分散数でタスクの並列処理をおこなう

マルチコアCPUを前提にして、システムに最適な分散数でタスクの並列処理をさせてみましょう。

var source = Enumerable.Range(0, 4);

// マルチコア数にあった並列処理をする
var list = source.AsParallel()
    .Select(n =>
    {
        Debug.WriteLine("task{0} start", n);

        // NOTE:すごい時間のかかる処理をしているつもり
        new Task(() => { }).Wait(1000);
        
        Debug.WriteLine("task{0} end", n);
        return n;
    })
    .ToList<int>();

Debug.WriteLine("tasks finished");
foreach(int n in list)
{
    Debug.WriteLine(n);
}

以下のように出力されます。

出力:
task2 start
task3 start
task0 start
task1 start
task2 end
task3 end
task0 end
task1 end

tasks finished
0
3
1
2

処理結果の順番を強制して並列処理をおこなう

var source = Enumerable.Range(0, 4);

// マルチコア数にあった並列処理をする
var list = source.AsParallel()
    .AsOrdered()
    .Select(n =>
    {
        Debug.WriteLine("task{0} start", n);

        // NOTE:すごい時間のかかる処理をしているつもり
        new Task(() => { }).Wait(1000);
        
        Debug.WriteLine("task{0} end", n);
        return n;
    })
    .ToList<int>();

Debug.WriteLine("tasks finished");
foreach(int n in list)
{
    Debug.WriteLine(n);
}

以下のように出力されます。

出力:
task3 start
task2 start
task0 start
task1 start
task3 end
task1 end
task0 end
task2 end

tasks finished
0
1
2
3