Share via


如何:衡量 PLINQ 查询性能

此示例演示如何使用 Stopwatch 类来衡量 PLINQ 查询执行所花费的时间。

示例

此示例使用空的 foreach 循环(Visual Basic 中为 For Each)来衡量查询执行所花费的时间。 在实际代码中,该循环通常包含额外的处理步骤,这些步骤会增加查询总执行时间。 请注意,秒表会恰好在循环开始之前启动,因为此时查询开始执行。 如果需要更精细的度量,您可以使用 ElapsedTicks 属性,而不是 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();

}

当您在体验查询实现时,总执行时间是一项非常有用的指标,但它并不总是能说明一切。 为了更深入细致地了解查询线程相互之间的交互以及与其他正在运行的进程的交互,请使用并发可视化工具。 Microsoft Visual Studio 2010 高级专业版 中提供了此工具。 有关更多信息,请参见并发可视化工具

请参见

概念

并行 LINQ (PLINQ)