#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:
Вы могли бы попробовать использовать минипрофайлер в своем коде, я нашел его довольно аккуратным и полезным:
Комментарии:
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 — хороший инструмент:
Комментарии:
1. Спасибо, я учел это, однако мне пришлось бы где-то запустить (и сохранить) секундомер. HttpContext.Current. Временная метка добавляется довольно рано в конвейере, поэтому кажется хорошим местом для измерения времени ответа.
2. Принял это как ответ и добавлю ваш ответ к решению.