2009-03-18 3 views
1

Я только что унаследовал веб-сайт (ASP.Net 2.0), написанный кем-то другим, который мне нужно поддерживать.
Код не ужасен, но он имеет ряд вещей, которые делают сайт невероятно медленным.Глобальное время страниц ASP.Net

У меня есть идея контролировать это, и я хочу посмотреть, что думают об этом более опытные разработчики.

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

Я собираюсь подключить события PreRequestHandlerExecute и PostRequestHandlerExecute в Global.asax и создать StopWatch в «Pre», прикрепить его к HttpContext.Items и прочитать его в «Post», и если запрос занял больше чем, скажем, 100 мс, он сообщит мне, чтобы сообщить мне.

Некоторые «псевдо код» для того что бы быть:

protected void Application_PreRequestHandlerExecute(Object sender, EventArgs e) { 
    System.Diagnostics.Stopwatch theTimer = new Stopwatch(); 
    theTimer.Start(); 
    HttpContext.Current.Items.Add("RequestTimer", theTimer); 
} 

protected void Application_PostRequestHandlerExecute(Object sender, EventArgs e) { 
    Stopwatch theTimer = (Stopwatch) HttpContext.Current.Items["RequestTimer"]; 
    System.Diagnostics.Debug.WriteLine(theTimer.ElapsedMilliseconds + "@: " + HttpContext.Current.Request.RawUrl) 
} 

Что вы думаете о таком подходе?
Можно ли это сделать?
Будет ли мой сайт сканировать на колени?
Есть ли лучший способ сделать это?

Некоторые мысли:
- Это может быть лучше, чтобы захватить DateTime.Now.Ticks и хранить ту, которая, вероятно, будет легче, чем StopWatch
- Я знаю, что было бы лучше, чтобы иметь наследуют все страницы от моей страницы и времени, но я не хочу проходить через десятки страниц и менять их все.

Любые мысли очень ценятся! Спасибо!

ответ

1

Вместо того, чтобы возиться с секундомером, я просто бросил время начала в коллекции HttpContext и вытащил его обратно. Затем вы можете выполнить простое вычитание в конце запроса, которое должно иметь незначительное влияние на производительность.

3

Лучшим подходом было бы включить tracing.

+0

Правильно, но я не хочу смотреть на отслеживание все время. Я хочу исправить узкие места, которые я нахожу, а затем пусть веб-сайт работает, и пусть он отправляет мне электронное письмо, когда что-то в частности происходит медленно. Думаю, я не могу это сделать с отслеживанием. –

+0

Это хороший момент, вы не могли бы сделать это с помощью трассировки. –

2

Я бы этого не сделал. Это будет больше проблем, чем того стоит. Есть несколько хороших инструментов профилирования для ASP.NET, таких как CLR Profiler и ANTS Profiler Red Gate.

+0

Проблема с профилированием заключается в том, что производительность исполнения во время выполнения действительно ДЕЙСТВИТЕЛЬНО плоха. Я хочу, чтобы этот код работал, и пусть он уведомляет меня, когда что-то медленнее, чем нужно. У меня не может быть веб-сайт с профилировщиком, прикрепленным к нему. –

+0

Да, я знаю, как плохо это делать с помощью «производственного» кода, но, честно говоря, он был в производстве уже, когда я его получил, поэтому я не могу много сделать. –

+0

С какими проблемами вы, в частности, думаете? Считаете ли вы, что это может вызвать исключения или замедление? Что-то другое? –

1

As BobbyShaftoe примечание, профилирование ваш лучший выбор. Но рассмотрите также dotTrace JetBrains; это очень, очень хорошо.

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