Вопрос о времени загрузки страницы ASP.NET - PullRequest
1 голос
/ 31 августа 2011

Мне нужно измерить общее время загрузки страницы от нажатия кнопки меню до полной визуализации. Я сделал это, используя BeginRequest и EndRequest события. Поскольку некоторые числа были слишком большими, я начал измерять время для каждого метода и события, которое страница выполняла при загрузке. С помощью секундомера я рассчитал Preinit, Init, Load и т. Д., Все события в жизненном цикле страницы и все другие методы, которые я создал. Мое удивление было в том, что, добавляя эти числа, я даже не приблизился к числам, которые я получил, используя запрос начала / конца. Последний был даже двойной, тройной, например, 7 секунд по сравнению с 2 секундами, которые я получил от каждого события / метода.

Так что мне интересно, откуда это дополнительное время? Между моими таймингами, которые показаны в окне отладки, я мог видеть все виды «загрузки jhfggdfaasdf.dll», возможно, некоторый временный файл. Может ли эта загрузка DLL занять это время?

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

Ответы [ 2 ]

2 голосов
/ 31 августа 2011

РЕДАКТИРОВАТЬ: После прочтения вашего вопроса, вы можете использовать тип решения веб-сайта asp.net. Это не предварительно скомпилировано, когда вы отлаживаете и когда вы впервые запрашиваете страницу, она компилирует ее в класс в вашем каталоге asp.net. Затем DLL-библиотека для класса загружается в домен приложения с забавным именем, подобным тому, которое вы упомянули. Это происходит в первый раз, когда вы запрашиваете одну из этих страниц, и когда вы хотите развернуть ее, вы можете предварительно скомпилировать свой сайт для повышения производительности.

Если вы видите «loading xyz.dll», это означает, что домен приложения загружается в материал, который будет использоваться приложением. Это происходит, когда вам нужно запустить код из необходимых библиотек (в вашем случае, вероятно, сторонних библиотек), которые еще не были загружены в домен приложения. Это хорошо, потому что это означает, что страница, которая использует библиотеку, но никогда не вызывалась, никогда не загружает эту сборку в память. Вы можете переместить этот запрос с запроса первой страницы на загрузку приложения, предварительно загрузив все сборки в вашей корзине в домен приложения при запуске приложения. Это компромисс между использованием памяти и скоростью запросов. Этот вопрос - хорошее место для начала:

Как предварительно загрузить все развернутые сборки для домена приложений

Вы можете получить хороший обзор времени жизненного цикла вашей страницы с помощью функции трассировки в asp.net. Это можно установить в файле web.config, как описано в этой статье:

http://msdn.microsoft.com/en-us/library/94c55d08.aspx

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

Если визуализация страницы по-прежнему занимает много времени, на стороне клиента существуют такие факторы, как

  • ваша страница очень большая
  • интерпретируете ли вы javascript до того, как все html и css были написаны
  • ваша сеть медленная
  • отправляете ли вы много css и js файлов? большинство браузеров ограничивают количество одновременных загрузок ресурсов. возможно, стоит объединить несколько CSS-файлов в один, в вашей производственной среде, по крайней мере,
  • Вы используете клиентский кеш. вы можете сказать браузеру что-то кэшировать на некоторое время. Есть способы аннулировать этот кеш, если ваш контент требует обновления.

Это можно отладить с помощью клиентских инструментов, таких как firebug или инструменты разработчика в chrome.

0 голосов
/ 31 августа 2011

Секундомер сам по себе довольно громоздкий объект. Вы можете добавить время загрузки, используя его для записи времени. Немного более эффективным методом было бы использовать простое сравнение даты и времени.

protected void Pre_Init(object sender, EventArgs e)
    DateTime started = DateTime.Now;

    // .... some code

    lblDisplayComment.Text = DateTime.Now.Subtract(started).TotalMilliseconds.ToString();
}

Это даст вам время в мс, необходимое для выполнения только этого метода.

...