• 検索結果がありません。

1. Microsoft Visual Studio 2010

を起動します。

[

スタート

]

ボタンをクリックし、

[

すべて のプログラム

]

[Microsoft Visual Studio 2010]

[Microsoft Visual Studio 2010]

の順にク リックします。

2. %TrainingKitInstallationFolder%\Labs\IntroToParallelExtensions\Source\Ex04-PLINQ\begin

フォルダーの

C#

フォルダーもしくは

VB

フォルダーにある

ParallelExtLab.sln

ソリューションフゔ゗ルを開きます。

(

お好みの言語を選択してく

ださい。

)

前の演習で作成したソリューションから作業を続行することもできます。

3. Main()

メソッドから現在呼び出しているメソッドを、

Ex4Task1_PLINQ()

メソッドに 置き換えます。

C#

static void Main(string[] args) {

...

// 呼び出すメソッド

Ex4Task1_PLINQ();

...

}

Visual Basic

Sub Main(ByVal args() As String) ...

' Methods to call Ex4Task1_PLINQ() ...

End Sub

4. Ex4Task1_PLINQ ()

メソッドを

Program.cs (C#)

または

Module1.vb (Visual Basic)

に追加 します。

(

コードスニペット

: Intro to Parallel Extensions Lab - Ex4 Ex4Task1_PLINQ SCharp) C#

static void Ex4Task1_PLINQ() {

var q = Enumerable.Select(

Enumerable.OrderBy(

Enumerable.Where(employeeData, x => x.EmployeeID % 2 == 0),

x => x.EmployeeID),

x => PayrollServices.GetEmployeeInfo(x)) .ToList();

foreach (var e in q) {

Console.WriteLine(e);

} }

(

コードスニペット

– Intro to Parallel Extensions Lab - Ex4 Ex4Task1_PLINQ VB) Visual Basic

Private Sub Ex4Task1_PLINQ() Dim q = Enumerable.Select(

Enumerable.OrderBy(

Enumerable.Where(

employeeData,

Function(x) x.EmployeeID Mod 2 = 0), Function(x) x.EmployeeID),

Function(x) PayrollServices.GetEmployeeInfo(x)) _ .ToList()

For Each e In q

Console.WriteLine(e) Next e

End Sub

メモ

: Select()

メソッド、

OrderBy()

メソッド、および

Where()

メソッドは

IEnumerable<T>

クラスからの拡張メソッドですが、ここでは静的にゕクセスしてい

ます。より簡潔な使用方法については、後で説明します。

ToList()

呼び出しは、説明を目的としており、運用コードには必ずしも必要ではあ

りません。ここでは、

LINQ

クエリをすぐに実行してすべての従業員情報文字列を 収集し、後で画面に表示するために使用しています。

ToList()

メソッドを省略する場合でも、クエリは

EmployeeID

順に実行されますが、

GetEmployeeInfo()

への各呼び出しは

IEnumerable<T>

foreach

ループで反復処理さ れるまで実行されません。これを遅延実行と呼びます。

詳細については、

Scott Wisniewski

の記事

(http://msdn.microsoft.com/ja-jp/magazine/cc163378.aspx) を参照してください。

5.

ゕプリケーションをビルドして実行します。

6. LINQ

クエリで、

EmployeeID

順に処理が実行されます。この処理の完了に要する合計 時間にも注目してください

(

実際の時間は状況によって異なります

)

13

並列処理しない

LINQ

クエリの出力

7.

このクエリの並列化は簡単です。そのためには、静的

ParallelEnumerable

クラスに含 まれる同等の

LINQ

メソッドを使用します。また、

AsParallel()

の呼び出しをクエリの データソースに追加することも必要です。

Main()

メソッドを変更して

PLINQAsParallel

メソッドを呼び出します。

C#

static void Main(string[] args) {

...

// 呼び出すメソッド Ex4Task1_PLINQAsParallel();

...

}

Visual Basic

Sub Main(ByVal args() As String) ...

' 呼び出すメソッド

Ex4Task1_PLINQAsParallel() ...

End Sub

8. Ex4Task1_PLINQAsParallel ()

メソッドを

Program.cs (C#)

または

Module1.vb (Visual Basic)

に追加します。

(

コードスニペット

: Intro to Parallel Extensions Lab - Ex4 Ex4Task1_PLINQAsParallel CSharp)

C#

static void Ex4Task1_PLINQAsParallel() {

var q = ParallelEnumerable.Select(

ParallelEnumerable.OrderBy(

ParallelEnumerable.Where(employeeData.AsParallel(), x => x.EmployeeID % 2 == 0),

x => x.EmployeeID),

x => PayrollServices.GetEmployeeInfo(x)) .ToList();

foreach (var e in q) {

Console.WriteLine(e);

} }

(

コードスニペット

– Intro to Parallel Extensions Lab - Ex4 Ex4Task1_PLINQAsParallel VB) Visual Basic

Private Sub Ex4Task1_PLINQAsParallel() Dim q = ParallelEnumerable.Select(

ParallelEnumerable.OrderBy(

ParallelEnumerable.Where(

employeeData.AsParallel(),

Function(x) x.EmployeeID Mod 2 = 0), Function(x) x.EmployeeID),

Function(x) PayrollServices.GetEmployeeInfo(x)) _ .ToList()

For Each e In q

Console.WriteLine(e) Next e

End Sub

メモ

:

このタスクの前半では

Enumerable

静的クラスで行われていた

Select()

メソッ ド、

OrderBy()

メソッド、および

Where()

メソッドの呼び出しが、

ParallelEnumerable

クラスで実行されるようになりました。また、

AsParallel()

の呼 び出しがデータソースに追加されました。

9.

ゕプリケーションをビルドして実行します。

10. LINQ

クエリでは、処理が特定の順序で実行されなくなります。また、この例では、

並列処理されるクエリの実行時間は並列処理されない場合よりも短縮されます

(

この 場合はデュゕルコゕコンピューターで実行しているため、実行時間がおよそ半減し ています。短縮される時間は、このサンプルを実行するハードウェゕによって異な ります

)

14

並列処理する

LINQ

クエリの出力

メモ

:

並列に同時実行される操作の数は、使用可能な物理コゕ数に応じて増加しま す。

関連したドキュメント