Condividi tramite


Procedura: misurare le prestazioni di esecuzione delle query di PLINQ

Questo esempio mostra come utilizzare la classe Stopwatch per misurare il tempo di esecuzione di una query PLINQ.

Esempio

Questo esempio utilizza un ciclo vuoto foreach (For Each in Visual Basic) per misurare il tempo di esecuzione di una query. Nelle applicazioni reali di codice, il ciclo in genere contiene passaggi di elaborazione aggiuntivi il cui tempo di esecuzione viene aggiunto al tempo di esecuzione complessivo della query. Notare che il cronometro è fermo fino a poco prima del ciclo, poiché questo istante corrisponde al momento in cui inizia l'esecuzione della query. Se si richiede una misura più precisa è possibile utilizzare la proprietà ElapsedTicks anziché ElapsedMilliseconds.

Sub Main()
    Dim source = Enumerable.Range(0, 3000000)
    Dim queryToMeasure = From num In source
                         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

    Dim elapsed As Long
    elapsed = sw.ElapsedMilliseconds ' or sw.ElapsedTicks
    Console.WriteLine("Total query time: {0} ms.", elapsed)

    ' Keep the console window open in debug mode.
    Console.WriteLine("Press any key to exit.")
    Console.ReadKey()
End Sub
static void Main()
{
    var source = Enumerable.Range(0, 3000000);

    var queryToMeasure = from num in source
                         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.
    System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew();

    // For pure query cost, enumerate and do nothing else.
    foreach (var n in queryToMeasure) { }

    long elapsed = sw.ElapsedMilliseconds; // or sw.ElapsedTicks

    Console.WriteLine("Total query time: {0} ms", elapsed);

    // Keep the console window open in debug mode.
    Console.WriteLine("Press any key to exit.");
    Console.ReadKey();

}

Benché il tempo di esecuzione totale sia una metrica utile quando si sperimentano le implementazioni della query, in genere non fornisce informazioni esaustive. Per ottenere una visualizzazione più approfondita e dettagliata dell'interazione dei thread della query con gli altri thread della query e con gli altri processi in esecuzione, utilizzare il Visualizzatore di concorrenze. Questo strumento è disponibile in Microsoft Visual Studio 2010 Premium. Per ulteriori informazioni, vedere Visualizzatore di concorrenze.

Vedere anche

Concetti

Parallel LINQ (PLINQ)