Точный способ измерения времени запроса / ответа приложения Asp.Net Приложение MVC

#c# #asp.net #.net #asp.net-mvc-3 #datetime

#c# #asp.net #.net #asp.net-mvc-3 #дата и время

Вопрос:

Рассмотрим следующий код для измерения времени запроса / ответа в Asp.Net приложение:

 protected void Application_EndRequest()
{
    Trace.WriteLine(string.Format("{0}:{1}",
         (DateTime.Now - HttpContext.Current.Timestamp).TotalMilliseconds,
         HttpContext.Current.Request.RawUrl));
}
  

Согласно MSDN, DateTime.Now имеет приблизительное разрешение 10 миллисекунд.

Также из MSDN HttpContext.Описание метки времени,

Временная метка, возвращаемая из Timestamp свойства, является локальным временем сервера и устанавливается во время создания экземпляра HttpContext объекта. Местное время равно времени UTC плюс смещение UTC.

Приведенный выше код теоретически должен дать мне общее время запроса / ответа в миллисекундах.

Мой вопрос в том, насколько точным это будет? И есть ли более точный / лучший способ сделать это?

Ответ №1:

Вы могли бы попробовать использовать минипрофайлер в своем коде, я нашел его довольно аккуратным и полезным:

http://miniprofiler.com/

Комментарии:

1. Спасибо, Другор, это выглядело действительно хорошо, но я придерживаюсь подхода, описанного выше 🙂

2. MiniProfiler — это, безусловно, правильный путь, но только если вы не можете использовать New Relic Agent на своем сервере IIS — newrelic.com/docs/dotnet

Ответ №2:

Класс StopWatch потенциально может иметь точность до микросекунд в зависимости от аппаратного обеспечения и операционной системы. Существует свойство IsHighResolution для чтения, если вы находитесь в режиме высокого разрешения. Если нет, то вы ограничены точностью системного таймера.

http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

Преимущество использования этого класса в том, что вы, безусловно, будете не хуже, чем приведенный выше код. Если использовать hi-res, вы получите гораздо большую точность.

Но, если вы пытаетесь измерить производительность и получить лучшее представление о своем сервисе, то есть инструменты получше.

Например, perfview — хороший инструмент:

http://blogs.msdn.com/b/dotnet/archive/2012/10/09/improving-your-app-s-performance-with-perfview.aspx

Комментарии:

1. Спасибо, я учел это, однако мне пришлось бы где-то запустить (и сохранить) секундомер. HttpContext.Current. Временная метка добавляется довольно рано в конвейере, поэтому кажется хорошим местом для измерения времени ответа.

2. Принял это как ответ и добавлю ваш ответ к решению.