Udostępnij za pomocą


Instrukcje: mierzenie wydajności zapytań PLINQ

W tym przykładzie pokazano, jak za pomocą klasy Stopwatch zmierzyć czas potrzebny na wykonanie zapytania PLINQ.

Przykład

W tym przykładzie użyto pustej pętli foreach (For Each w języku Visual Basic), aby zmierzyć czas potrzebny na wykonanie zapytania. W rzeczywistym kodzie pętla zwykle zawiera dodatkowe kroki przetwarzania, które są dodawane do łącznego czasu wykonywania zapytania. Zwróć uwagę, że stoper nie jest uruchamiany aż do tuż przed pętlą, ponieważ właśnie wtedy rozpoczyna się wykonywanie zapytania. Jeśli potrzebujesz bardziej szczegółowego pomiaru, możesz użyć właściwości ElapsedTicks zamiast ElapsedMilliseconds.

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

class ExampleMeasure
{
    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.
        var 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: {elapsed} ms");

        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
Module ExampleMeasure
    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 = 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: {elapsed} ms.")

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

Całkowity czas wykonywania to przydatna metryka podczas eksperymentowania z implementacjami zapytań, ale nie zawsze opowiada całą historię. Aby uzyskać bardziej rozbudowany widok interakcji wątków zapytań ze sobą i z innymi uruchomionymi procesami, użyj Concurrency Visualizer.

Zobacz też