[PLINQ]PLINQ介紹

PLINQ基本介紹

Why PLINQ

  • 假設某項作業可以平行化,則該作業的計算成本愈高,加速的機會就愈大。例如,如果某個函式需要 1 秒來執行,則對超過 1000 個項目執行循序查詢將需花費 1000 秒來執行該作業,但是在四核心電腦上執行平行查詢只需花費 250秒。這樣即產生 750秒的加速效果。
  • PLINQ自動平行處理查詢,簡化平行處理與合併的動作,使用上跟LINQ差不多。

什麼是平行查詢-PLINQ

PLINQ 是 LINQ 模式的平行實作。在許多方面 PLINQ 查詢與非平行 LINQ to Objects 查詢十分類似。就像循序 LINQ 查詢,PLINQ 查詢同樣會對任何記憶體中的 IEnumerable 或 IEnumerable<T> 資料來源運作,而且採用延後執行模式 。主要差別在於 PLINQ 會嘗試充分運用系統上的所有處理器,將資料來源分割成多個區段,然後以平行方式,以個別的背景工作執行緒在多個處理器上對每個區段執行查詢。在許多情況下,平行執行可讓查詢速度快許多。

 

AsParallel–平行處理

只要加上AsParallel,就會以平行方式執行,而PLINQ執行方式,會先將內容給分配不同的執行緒執行,等到跑foreach、ToArray()、ToList()的時候,會把結果merge回原本主要的執行緒上,如圖示。

用法:

string[] array ={ "Adams","Arthur","Buchanan","Bush",
                        "Carter","Cleveland","Clinton","Coolidge","Eisenhower",
                        "Hayes","Hoover","McKinley","Roosevelt",
                        "Taft","Taylor","Wilson"};

var data = array.AsParallel().Select(x => x.ToUpper());

foreach (var item in data)
{
    Console.WriteLine(item);
}
 

AsOrdered、AsUnordered–保留來源順序、不保留來源順序

單純使用AsParallel無法保證輸出的順序,會與來源順序一樣,在某些情況下,來源資料的順序必須保有其順序,才能達到查詢的正確性  AsOrdered會在整個分割過程中追蹤原始順序,並在合併期間確保順序的一致性。
string[] array ={ "Adams","Arthur","Buchanan","Bush",
                        "Carter","Cleveland","Clinton","Coolidge","Eisenhower",
                        "Hayes","Hoover","McKinley","Roosevelt",
                        "Taft","Taylor","Wilson"};

var data = array.AsParallel()
    .AsOrdered()
    .Select(x => x.ToUpper()) //保留順序
    .AsUnordered()
    .Select(x => x.ToLower()); // 不保留順序

 

AsSequential–循序處理

PLINQ提供AsSequential方法,將查詢中所有後續運算子都會以循序的方式執行,直到再次呼叫AsParallel才會改成平行處理。
string[] array ={ "Adams","Arthur","Buchanan","Bush",
                        "Carter","Cleveland","Clinton","Coolidge","Eisenhower",
                        "Hayes","Hoover","McKinley","Roosevelt",
                        "Taft","Taylor","Wilson"};

var data = array.AsParallel()
    .Where(x => x.Contains("o"))
    .AsSequential() // 之後的運算子都變回循序處理
    .Select(x => x.ToUpper());

以上為Parallel基本用法。

 

參考資料:http://www.albahari.com/threading/part5.aspx

 

 

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

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