[PLINQ]輸出優化

ForAll

使用PLINQ能夠很方便地從平行作業將結果蒐集起來,變成單一序列輸出,如下圖所示。

這樣的結果表示,查詢過程是平行處理,但是在輸出的時候,會把結果merger回原本的主執行緒上。

public void Run() 
{ 
    var data = "abcdef".AsParallel().AsOrdered().Select(x => char.ToUpper(x));
    var watch = new Stopwatch();

    watch.Start();
    foreach (var item in data)
    {
        this.DoSomething(item);
    }
    watch.Stop();

    Console.WriteLine("Foreach Time: {0} ms", watch.ElapsedMilliseconds); // 3047ms

}

private void DoSomething(char c)
{
    Thread.Sleep(500);
    Console.WriteLine(c);
}

此程式範例說明,實際上輸出結果是交由主執行緒處理,所以每0.5秒會輸出一個字元,最後花3.047秒完成。

 

當結果不必在乎輸出順序時,而是純存執行某個動作,可以使用ForAll的方式,來加快輸出

使用ForAll,並不會將結果merger回原本的主執行緒上,而是會在各式的執行緒把作業完成。

public void Run() 
{ 
    var watch = new Stopwatch();

    watch.Start();

    "abcdef".AsParallel().AsOrdered().Select(x => char.ToUpper(x))
        .ForAll(c => { this.DoSomething(c); });
    watch.Stop();

    Console.WriteLine("ForAll Consume Time: {0} ms", watch.ElapsedMilliseconds); //1023ms

}

private void DoSomething(char c)
{
    Thread.Sleep(500);
    Console.WriteLine(c);
}

每個執行緒各自完成工作,花費時間只要1.023秒,相對快很多。

 

 

一天一分享,身體好健康。

該追究的不是過去的原因,而是現在的目的。