2009-12-10 11 views
6

Скажем, у меня есть метод Foo(), и я хочу измерить время в миллисекундах, которое потребовалось для выполнения какого типа счетчика производительности Windows, который я должен использовать?Каков наиболее подходящий тип счетчика производительности для измерения времени работы?

var stopwatch = new Stopwatch(); 
stopwatch.Start(); 
Foo(); 
stopwatch.Stop(); 
counter.RawValue = stopwatch.TotalMilliseonds; 

В настоящее время я использую NumberOfItems64, но при этом сохраняется последнее значение счетчика, если только не выполняется новая операция. Желательно? Или должен ли счетчик идти к нулю, как только операция будет выполнена? Какой тип счетчика вы бы выбрали в этой ситуации и почему?

ответ

7

Это звучит как хороший кандидат для AverageTimer32. См. this SO answer для получения более подробной информации.

+0

Хотя я не хочу усреднять время по разным вызовам. –

+0

Вы не можете реально сделать многое другое, потому что что бы вы записывали для одновременных запросов? –

0

Я обычно использую Секундомер, но я также использовал п/ссылаться на kernel32.dll:

[DllImport("Kernel32.dll")] 
    private static extern bool QueryPerformanceCounter(out long lpPerformanceCount); 

    [DllImport("Kernel32.dll")] 
    private static extern bool QueryPerformanceFrequency(out long lpFrequency); 

У меня есть два метода под названием Start() и Stop():

public void Start() 
    { 
    Thread.Sleep(0); 
    QueryPerformanceCounter(out startTime); 
    } 


    public void Stop() 
    { 
    QueryPerformanceCounter(out stopTime); 
    } 

Для запрос продолжительности между вызовами Пуск() и Stop():

public double Duration 
    { 
    get 
    { 
     return (double)(stopTime - startTime)*1000/(double)freq; 
    } 
    } 

freq Обратите внимание, что определяется конструктор:

public PerformanceTimer() 
    { 
    startTime = 0; 
    stopTime = 0; 

    if (QueryPerformanceFrequency(out freq) == false) 
    { 
     // not supported 
     throw new Win32Exception(); 
    } 
    } 

Для моих потребностей, я не заметил большой разницы, хотя я предлагаю вам попробовать и посмотреть, что подходит вам.

Редактировать: Я смог найти original code from MSDN. Похоже, что есть некоторые улучшения, сделанные с .Net 1.1. Сообщение о доставке заключается в том, что Microsoft заявляет, что этот метод обеспечивает точность наносекунд.

+0

Секундомер также использует QueryPerformanceCounter. Но вопрос не о том, как измерить временной интервал. Это о том, как сохранить измеренное значение для последующего анализа. – user1295211

1

Чтобы добавить к предыдущему ответу, есть very good article на обоих готовых и заказных счетчиков производительности на CodeProject ..

0

Ответ и вопрос:

Ответ: низкотехнологичное работает для меня. Вы хотите микросекунды? Скопируйте его 10^6 раз и используйте свои часы.

Вопрос: Вы спрашиваете, хотите ли вы быстрее сделать свой код? Затем consider this.