Procedimiento para medir el rendimiento de consultas PLINQ
En este ejemplo se muestra cómo utilizar la clase Stopwatch para medir el tiempo que tarda en ejecutarse una consulta PLINQ.
Ejemplo
Este ejemplo utiliza un bucle foreach
vacío (For Each
en Visual Basic) para medir el tiempo que tarda en ejecutarse la consulta. En el código real, el bucle normalmente contiene pasos de procesamiento adicional que se agregan al tiempo de ejecución de consulta total. Verá que el cronómetro no se inicia hasta justo antes del bucle, ya que ese es el momento en el que comienza la ejecución de las consultas. Si necesita una medición más específica, puede utilizar la propiedad ElapsedTicks
en lugar de 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
El tiempo de ejecución total es una métrica útil cuando se experimenta con implementaciones de consulta, pero no siempre muestra todo el panorama. Para obtener una vista más detallada y completa de la interacción de los subprocesos de consulta entre sí y con otros procesos en ejecución, use el Visualizador de simultaneidad.