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
一天一分享,身體好健康。
該追究的不是過去的原因,而是現在的目的。