Практическое руководство. Измерение производительности запросов PLINQHow 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 (For Each в Visual Basic).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