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
クエリの出力メモ