Dela via


Anvisningar: Mäta PLINQ-frågeprestanda

Det här exemplet visar hur du använder Stopwatch klassen för att mäta den tid det tar för en PLINQ-fråga att köras.

Exempel

I det här exemplet används en tom foreach loop (For Each i Visual Basic) för att mäta den tid det tar för frågan att köras. I verklig kod innehåller loopen vanligtvis ytterligare bearbetningssteg som lägger till den totala frågekörningstiden. Observera att stoppuret inte startas förrän strax före loopen, eftersom det är då frågekörningen börjar. Om du behöver mer detaljerad mätning kan du använda ElapsedTicks egenskapen i stället för 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: {0} ms", elapsed);

        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

Den totala körningstiden är ett användbart mått när du experimenterar med frågeimplementeringar, men den berättar inte alltid hela historien. Om du vill få en djupare och mer omfattande vy över interaktionen mellan frågetrådarna och andra processer som körs använder du Concurrency Visualizer.

Se även