[PLINQ]選擇循序模式

PLINQ  選擇循序模式

PLINQ在執行的時候,不一定會平行處理,因為會尋找導致查詢在平行模式中執行得更緩慢的查詢運算子或運算子組合,當PLINQ發現這各類型時,會預設回到循序模式

PLINQ其中一個會退回循序模式的規則如下

在已將原始索引移除或重新排列的排序運算子或篩選運算子之後,包含索引 Select、索引 Where、索引 SelectMany 或 ElementAt 子句的查詢

在這邊舉個例子說明:

Stopwatch sw = Stopwatch.StartNew();

var data = Enumerable.Range(0, 20000000)
    .AsParallel()
    .Where(x => x % 2 == 0)                
    .Select((x, index) => ExpensiveMethod(x, index)).ToArray();

sw.Stop();

Console.WriteLine("Consume Time : {0} ms", sw.ElapsedMilliseconds); // 5025 ms
以此程式為例,Where執行的時候,已經將順序重續排列,接著後面運算子使用包含索引(index)的Select,所以依照PLINQ預設,會退回循序模式。
那假設我要PLINQ強制平行處理怎麼辦?  其實很簡單,只要設定一下告訴PLINQ我後面的運算子,都強制平行處理就可以了。
Stopwatch sw = Stopwatch.StartNew();

var data = Enumerable.Range(0, 20000000)
    .AsParallel()
    .WithExecutionMode(ParallelExecutionMode.ForceParallelism) // 強制平行處理
    .Where(x => x % 2 == 0)                
    .Select((x, index) => ExpensiveMethod(x, index)).ToArray();

sw.Stop();

Console.WriteLine("Consume Time : {0} ms", sw.ElapsedMilliseconds); // 3902ms

讀者可以發現,用WithExecutionMode(ParallelExecutionMode.ForceParallelism)強制PLINQ平行處理反而變快了,這表示不一定可以相信PLINQ的預設機制XD

 

另外.NET 4.0 與 .NET4.5 預設機的不太一樣,如下圖示

  • 藍色 .NET4.0 和 .NET4.5會執行循序模式

  • 橘色 .NET4.0 會執行循序模式

 

 

 

 

 

 

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

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