Delen via


Hoe PLINQ-queryprestaties meten

In dit voorbeeld ziet u hoe u de Stopwatch-klasse gebruikt om de tijd te meten die nodig is om een PLINQ-query uit te voeren.

Voorbeeld

In dit voorbeeld wordt een lege foreach lus (For Each in Visual Basic) gebruikt om de tijd te meten die nodig is om de query uit te voeren. In echte code bevat de lus doorgaans aanvullende verwerkingsstappen die worden toegevoegd aan de totale uitvoeringstijd van de query. Merk op dat de stopwatch pas net voor de lus wordt gestart, omdat dan de uitvoering van de query begint. Als u meer verfijnde metingen nodig hebt, kunt u de eigenschap ElapsedTicks gebruiken in plaats van 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

De totale uitvoeringstijd is een nuttige metriek wanneer u experimenteert met query-implementaties, maar niet altijd het hele verhaal vertelt. Als u een uitgebreidere en diepere weergave wilt krijgen van de interactie van de query-draadjes met elkaar en met andere actieve processen, gebruiken de Concurrency Visualizer.

Zie ook