2009-10-24 2 views
1

У меня есть обычная страница asp.net, содержащая некоторый код, который я хочу измерить время выполнения. Я создал очень простой вспомогательный класс для этой цели:Измерение времени на странице ASP.NET

public class Timing 
{ 
    private long m_ticksBefore; 
    private long m_ticksAfter; 

    public void Before() 
    { 
     m_ticksBefore = DateTime.Now.Ticks; 
    } 

    public void After() 
    { 
     m_ticksAfter = DateTime.Now.Ticks; 
    } 

    public void TraceTime(string note) 
    { 
     TimeSpan span = new TimeSpan(m_ticksAfter - m_ticksBefore); 
     System.Diagnostics.Trace.Write(string.Format("\n...Timing for {0}...\nTicks: \t{1}\nMilliseconds: \t{2}\nSeconds: \t{3}\n..................", note, span.Ticks, span.TotalMilliseconds, span.TotalSeconds)); 
    } 
} 

Я экземпляр нового объекта синхронизации и перенесите код Я желаю, чтобы контролировать с до() и после методов и, наконец, вызов метода TraceTime() в для вывода результата в окно вывода в среде IDE.

Странно, что первый запрос на страницу приводит к ожидаемому результату синхронизации около 40 миллисекунд, но обновление страницы (F5) дает мне 0 тиков времени выполнения. Даже выполнив страницу с новыми параметрами, вынуждающих выполнение различного кода в пределах зоны наблюдения показывает плоский 0.

Если я использую System.Diagnostics.StopWatch вместо этого я получить гораздо более реалистичные результаты

Stopwatch watch1 = Stopwatch.StartNew(); 
//Some code to monitor 
watch1.Stop(); 
System.Diagnostics.Trace.Write(watch1.ElapsedTicks); 

для меня код кажется очень похожим, и я не могу понять, почему первый подход не позволяет выводить реалистичные результаты ...

Кажется, это какая-то проблема оптимизации, которая выполняется за сценой, но я не очень возьми. Возможно, это связано с моим личным вопросом времени, то есть вопросом времени на ночь ...

ответ

1

Хотя DateTime.Now имеет разрешение 100 нс, Windows фактически обновляет свои внутренние часы каждые 15 мс. Поэтому, если ваш код занимает менее 7,5 мс для запуска, он, похоже, совсем не занимает времени, так как в среднем вам нужно ждать 7.5 мс для DateTime.Now для изменения.

Если вам нужно более точное время, вы можете (как вы нашли) использовать StopWatch. Для получения результатов используется другой, более точный API.

EDITMSDN documentation for DateTime.Now дает разрешение как «приблизительно 10 мс». API GetTickCount (который использует тот же системный таймер) дает свое разрешение как «обычно в диапазоне от 10 миллисекунд до 16 миллисекунд».

По-видимому, это зависит от оборудования: однопроцессорные системы обычно составляют 10 мс, а несколько процессорных систем обычно составляют 15 мс.

+0

Проблема в том, что одно и то же кодирование занимает 40 мс в одной ситуации, а 0 - в другом ... конечно, код, способный реагировать по-разному в сценарии обратной передачи, но он этого не упоминал. –

+0

Могу сказать, что на самом деле он не принимает 0 мс. Это все еще довольно капля, но от 40 мс до <10 мс гораздо более правдоподобно, чем от 40 мс до 0 мс. – stevemegson

+0

Я вижу .. это правда. –

0

Я не испытываю такой же проблемы, как и вы. Я поставил следующий код на событие нажатия кнопки:

Timing timing = new Timing(); 
timing.Before(); 
for (int i = 0; i < 100; i++) 
    Thread.Sleep(1); 
timing.After(); 
// I altered TraceTime to receive a HttpResponse. 
timing.TraceTime("this is a note", this.Response); 

Ответ всегда рядом с:

... Сроки это примечание ... Клещей: 1000057 миллисекунды: 100,0057 секунды: 0,1000057 ..................

Независимо от того, если это сообщение назад, а не создавать обратно ... Если я освежил страницы или нет.

Как вы используете класс Timing?

Редактировать

Я также поставил выше код на обработчик загрузки страницы и получил те же самые результаты. Неважно, если это пост-обратно, обновление или что-то еще.

Вы должны сообщить нам, в каком контексте происходит ошибка.

+0

Точно так же, как и в вашем примере. – 2009-10-24 23:47:22

+0

Код добавляется в обработчик загрузки страницы точно так же, как в вашем примере. В первый раз, когда я нажимаю страницу в режиме отладки, я получаю разумное значение, отображаемое в окне вывода. Если я перезагружу страницу (с F5 или ctrl + F5), я получаю 0 тиков. Это довольно странно ... – 2009-10-25 00:08:23

+0

Извините, я старался, но не могу воспроизвести. –

Смежные вопросы