方法: PLINQ クエリのパフォーマンスを測定するHow to: Measure PLINQ Query Performance

この例では、Stopwatch クラスを使用して、PLINQ クエリの実行にかかる時間を測定する方法を示します。This example shows how use the Stopwatch class to measure the time it takes for a PLINQ query to execute.

Example

この例では、空の foreach ループ (Visual Basic では For Each) を使用して、クエリの実行にかかる時間を計測します。This example uses an empty foreach loop (For Each in Visual Basic) to measure the time it takes for the query to execute. 実際のコードでは、ループには通常、クエリの合計実行時間への加算という追加の処理手順が含まれます。In real-world code, the loop typically contains additional processing steps that add to the total query execution time. ループでクエリの実行が開始されるため、ループの直前までストップウォッチが開始されないことに注目してください。Notice that the stopwatch is not started until just before the loop, because that is when the query execution begins. さらにきめ細かい測定値が必要な場合は、ElapsedMilliseconds ではなく、ElapsedTicks プロパティを使用することができます。If you require more fine-grained measurement, you can use the ElapsedTicks property instead of ElapsedMilliseconds.

using System;
using System.Diagnostics;
using System.Linq;

class Example
{
   static void Main()
   {
       var source = Enumerable.Range(0, 3000000);

       var queryToMeasure = from num in source.AsParallel()
                            where num % 3 == 0
                            select Math.Sqrt(num);

       Console.WriteLine("Measuring...");

       // The query does not run until it is enumerated.
       // Therefore, start the timer here.
       Stopwatch sw = Stopwatch.StartNew();

       // For pure query cost, enumerate and do nothing else.
       foreach (var n in queryToMeasure) { }

       sw.Stop();
       long elapsed = sw.ElapsedMilliseconds; // or sw.ElapsedTicks
       Console.WriteLine("Total query time: {0} ms", elapsed);

       Console.WriteLine("Press any key to exit.");
       Console.ReadKey();
   }
}
Module Example
    Sub Main()
        Dim source = Enumerable.Range(0, 3000000)
        ' Define parallel and non-parallel queries.
        Dim queryToMeasure = From num In source.AsParallel()
                             Where num Mod 3 = 0
                             Select Math.Sqrt(num)
        
        Console.WriteLine("Measuring...")

        ' The query does not run until it is enumerated.
        ' Therefore, start the timer here.
        Dim sw = System.Diagnostics.Stopwatch.StartNew()

        ' For pure query cost, enumerate and do nothing else.
        For Each n As Double In queryToMeasure
        Next

        sw.Stop()
        Dim elapsed As Long = sw.ElapsedMilliseconds  ' or sw.ElapsedTicks
        Console.WriteLine("Total query time: {0} ms.", elapsed)

        Console.WriteLine("Press any key to exit.")
        Console.ReadKey()
    End Sub
End Module

合計実行時間は、クエリの実装を試すときに便利なメトリックですが、これだけでは全貌が明らかにならない場合もあります。The total execution time is a useful metric when you are experimenting with query implementations, but it does not always tell the whole story. クエリ スレッド同士およびクエリ スレッドと他の実行中のプロセスとのやり取りをより深くより豊かに視覚化するには、コンカレンシー ビジュアライザーを使用します。To get a deeper and richer view of the interaction of the query threads with one another and with other running processes, use the Concurrency Visualizer. 詳細については、「コンカレンシー ビジュアライザー」を参照してください。For more information, see Concurrency Visualizer.

関連項目See also