Подтвердить что ты не робот

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

Мне было поручено повысить производительность приложения 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 на клиентской странице, я все еще сталкиваюсь с проблемой, что полоса прокрутки работает очень медленно. Это снова происходит из-за событий на странице, таких как событие фильтра/клика или сортировка или изменение индекса страницы в сетке (в основном все, что вызывает асинхронную обратную передачу).

Если у кого есть дополнительные идеи, не стесняйтесь звонить.

4b9b3361

Ответ 1

Ну, наконец, я получил эту работу... проблема была связана с другим недавним вопросом, который я нашел здесь: Почему говорит jQuery, чтобы щелкнуть мою ссылку, замедляя мою страницу?

Суть в том, что я подписывал события на элементах управления, которые были вне моей панели обновления. По сути, дублирование, утроение или привязка n событий на основе повторной подписки в моем jquery. См. Мою ссылку.

Ответ 2

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

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

Вы уверены, что это связано с обратной записью async? Сколько данных вы пытаетесь отобразить на странице за один раз?

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

Мое предложение состоит в том, что это, возможно, не проблема панели обновления, а проблема с разбивкой по страницам. Есть ли у вас возможности разбить ваши данные и показывать только несколько кусков за раз?

Ответ 3

У меня были огромные проблемы с производительностью с древовидными изображениями, имеющими большие данные внутри панели обновлений. Если у вас есть древовидная структура, он может "сделать" страницу, чтобы получить полную обратную передачу после нужной обратной передачи. Трассировка скажет историю. В конечном итоге я написал обертку ajax и сделал частичную обратную передачу сам. Treeview может быть панком.

Если у вас нет древовидной структуры, пожалуйста, не обращайте внимания.

edit: Если это имеет значение, у меня было около 250 элементов в древовидной структуре до 4 глубин.