Измерение времени на странице ASP.NET - PullRequest
1 голос
/ 25 октября 2009

У меня есть нормальная страница 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));
    }
}

Я создаю экземпляр нового объекта Timing и оборачиваю код, который хочу отслеживать, с помощью методов Before () и After и, наконец, вызываю метод 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);

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

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

Ответы [ 2 ]

1 голос
/ 25 октября 2009

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

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

РЕДАКТИРОВАТЬ Документация MSDN для DateTime.Now дает разрешение как "приблизительно 10 мс". API GetTickCount (который использует тот же системный таймер) дает свое разрешение как "обычно в диапазоне от 10 миллисекунд до 16 миллисекунд".

Очевидно, это зависит от аппаратного обеспечения - однопроцессорные системы обычно 10 мс, многопроцессорные системы обычно 15 мс.

0 голосов
/ 25 октября 2009

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

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?

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

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

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

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