Поделиться через


Практическое руководство. Измерение производительности запросов PLINQ

В этом примере показано, как использовать класс Stopwatch, чтобы измерить время, необходимое для выполнения запроса PLINQ.

Пример

В этом примере для измерения времени, необходимого для выполнения запроса, используется пустой цикл foreach (For Each в Visual Basic). В реальном коде цикл обычно содержит шаги дополнительной обработки, которые добавляются к общему времени выполнения запроса. Обратите внимание, что секундомер запускается непосредственно перед началом цикла, поскольку именно в это время начинается выполнение запроса. Если требуется более точное измерение, можно использовать свойство 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 Premium. Дополнительные сведения см. в разделе Визуализатор параллелизма.

См. также

Основные понятия

Parallel LINQ (PLINQ)