Мне было поручено повысить производительность приложения asp.net(4.5) webforms, которое, к сожалению, использует обновления. Они действительно злы. Но избавление от них не так просто, как система привязана ко всему множеству вещей. Мне удалось избавиться от некоторых панелей обновлений, которые были лишними.
В любом случае это система типа CRM, поэтому представьте, что вы переходите на страницу сведений, например, клиента. На этой странице сведений о клиенте у вас есть общая информация о клиенте. В нижней части страницы находятся вкладки. Например, на странице сведений о клиентах могут быть вкладки "Контакты", которые работают для этого клиента, "Продукты", которые клиент продает, "Оценки" для клиента. Каждая из этих вкладок в основном представляет собой div и обернутая вокруг него панель обновления. Сначала загружается только первая вкладка. Когда вы нажимаете на вкладку, выполняется асинхронный вызов, который загружает вкладку с данными. Итак, в основном у вас есть страница, которая выглядит примерно так: pseudocode:
updatepanel for entire page
html
<!-- tabs -->
updatepanel for contacts sub panel
contacts html
/updatepanel
updatepanel for products sub panel
products html
/update panel
updatepanel for ratings sub panel
ratings html
/update panel
/updatepanel end the entire page
Вкладки, как упоминалось, являются div и являются в основном вкладками jquery. Сначала я заметил, что на каждой панели обновлений на странице был установлен updatemode
на always
. Я сразу же изменил updatemode
на conditional
и явно назвал Update()
, когда мне понадобилась обновленная панель обновления. Очень небольшое улучшение. Затем я заметил, что начальная панель обновления (используемая для всей страницы) имеет свойство ChildrenAsTrigger
, установленное в true... поэтому я изменил это на false. Очень небольшое улучшение.
Затем я снова начал тестировать страницу, чтобы увидеть, как производительность... все еще очень дерьмовая. Фактически, когда страница сначала загружается, и первая вкладка загружает страницу очень быстро. Когда я нажимаю на другую вкладку (она загружает данные подпанели через асинхронный процесс, вызывая сопутствующее событие скрытой кнопки на сервере для загрузки данных). Так что это определенно не так, а айакс, но эй, что у нас есть. Таким образом, в основном событие на стороне сервера просто связывает некоторые данные с сеткой на этой вкладке. Производительность получения данных абсолютно прекрасна - это не моя проблема.
Моя проблема теперь, когда я просматриваю вверх и вниз, производительность страницы начинает ухудшаться. Как только я нажимаю на другую вкладку или другие 2-3 разных вкладки, производительность получения данных по-прежнему является удивительной... но после того, как я получу данные, и я прокручиваю страницу, это ужасно. Полоса прокрутки даже время от времени перескакивает, поскольку она не справляется с тем, как быстро я хочу перемещаться по странице.
Я не знаю, что еще нужно сделать, чтобы ускорить эту страницу, кроме того, что вы полностью удаляете обновления, но слишком много работы и времени для этого. До сих пор я пробовал следующее:
- устранено столько панелей обновлений, сколько не было необходимости
- изменен режим обновления от
always
доconditional
- изменено
childrenastriggers
наfalse
- исправлены любые ошибки/оптимизированы так сильно, как я мог на стороне asp.net/js
Что еще я могу сделать, чтобы исправить это или что еще может вызвать медленную задержку? Как уже упоминалось, получение данных происходит очень быстро, когда я перемещаюсь вверх и вниз (прокрутка), страница является очень изменчивой. Я выполнил рекомендацию msdn по обновлению панелей обновлений.
Изменить обновление
Я все еще работаю над этим, чтобы попытаться найти лучший способ. Я попытался использовать это:
http://aspadvice.com/blogs/robertb/archive/2005/11/16/13835.aspx
Позволяет мне обрабатывать состояние просмотра на стороне сервера. Эффект заключается в том, что разметка html избавилась от всей информации состояния представления, однако проблема, которую я до сих пор не разрешила, заключается в том, что по мере того, как я продолжаю делать асинхронные обратные вызовы событиями триггеров на странице, моя страница замедляется. То, что я имею в виду, замедляется, так как я просматриваю вверх/вниз страницу, производительность очень плохая. Полоса прокрутки должна догнать меня, когда я прокручиваю. Таким образом, даже избавляясь от сгенерированной информации о viewstate на клиентской странице, я все еще сталкиваюсь с проблемой, что полоса прокрутки работает очень медленно. Это снова происходит из-за событий на странице, таких как событие фильтра/клика или сортировка или изменение индекса страницы в сетке (в основном все, что вызывает асинхронную обратную передачу).
Если у кого есть дополнительные идеи, не стесняйтесь звонить.