中の技術日誌ブログ

C#とC++/CLIと
VBと.NETとWindowsで戯れる
 

目次

Blog 利用状況

ニュース

自己紹介

東京でソフトウェアエンジニアをやっています。
お仕事大募集中です。
記事執筆や、講師依頼とかでも何でもどうぞ(*^_^*)
似顔絵 MSMVPロゴ
MSMVP Visual C# Since 2004/04-2013/03

記事カテゴリ

書庫

日記カテゴリ

00-整理

01-MSMVP

.NET4によるパラレルクエリ

.NET4からLINQをお手軽にパラレル化することが出来ます。

たとえば以下のような配列があります。

var iar = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };

これを列挙して、すべてをコンソールに出力するという場合に以前では

var iar = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };
var y = (from x in iar select x);
foreach (var i in y)
{
  Console.WriteLine(i);
}

このような記述を行います。

リンクで列挙した(Ienumerable<int>)ものをListに変換(List<int>)して、ForEachで処理するという物です。

これをパラレル化するには、AsParallelというキーワードを追加します。

var iar = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };
var y = (from x in iar.AsParallel() select x);
foreach (var i in y)
{
  Console.WriteLine(i);
}

もちろん列挙する時点で処理の並列化がされるので、出力順は保証されません。

出力順を保証するためには、AsOrderedというキーワードを追加します。

var iar = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };
var y = (from x in iar.AsParallel().AsOrdered() select x);
foreach (var i in y)
{
  Console.WriteLine(i);
}

これにより処理の待ち合わせを自動で行ってくれるような物です。

ですから列挙処理などにおいては並列に処理しますが、それ以外の部分で並列化が行われないので、効率が悪くなります。

参照:PLINQ における順序維持

https://login.live.com/login.srf?wa=wsignin1.0&rpsnv=11&checkda=1&ct=1272096358&rver=6.0.5276.0&wp=MCLBI&wlcxt=msdn$msdn$msdn&wreply=http://msdn.microsoft.com/ja-jp/library/dd460677.aspx&lc=1033&id=254354

投稿日時 : 2010年4月26日 12:28

コメントを追加

# ブーツ UGG 2012/10/06 16:18 ugg クラシックショート

多くの質問があり、"私は説明を取得したいと考えています。

タイトル
名前
URL
コメント