Sdílet prostřednictvím


Postupy: Měření výkonu dotazu PLINQ

Tento příklad ukazuje, jak pomocí Stopwatch třídy měřit čas potřebný ke spuštění dotazu PLINQ.

Příklad

Tento příklad používá prázdnou foreach smyčku (For Each v jazyce Visual Basic) k měření času potřebnýho ke spuštění dotazu. V reálném kódu smyčka obvykle obsahuje další kroky zpracování, které se přidávají do celkové doby provádění dotazů. Všimněte si, že stopky se nespustí až těsně před smyčkou, protože to je čas zahájení provádění dotazu. Pokud požadujete jemněji odstupňované měření, můžete místo vlastnosti ElapsedMillisecondspoužít ElapsedTicks vlastnost .

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

Celková doba provádění je užitečná metrika při experimentování s implementacemi dotazů, ale ne vždy říká celý příběh. Pokud chcete získat hlubší a bohatší přehled o interakci vláken dotazu s ostatními a dalšími spuštěnými procesy, použijte Vizualizér souběžnosti.

Viz také