Как улучшить производительность приложений ASP.NET MVC?


Ответы:


311

Скомпилированный список возможных источников улучшения приведен ниже:

Общее

  • Используйте профилировщик для обнаружения утечек памяти и проблем с производительностью в вашем приложении. лично я предлагаю dotTrace
  • Запускайте свой сайт в режиме выпуска, а не в режиме отладки, как в работе, так и во время профилирования производительности. Режим выпуска намного быстрее. Режим отладки может скрыть проблемы с производительностью в вашем собственном коде.

Кэширование

  • Используйте CompiledQuery.Compile() рекурсивно, избегая перекомпиляции выражений вашего запроса
  • Кэшируйте содержимое, не подверженное изменению, OutputCacheAttribute чтобы сохранить ненужные и выполняемые действия
  • Используйте куки для часто доступной не конфиденциальной информации
  • Используйте ETag и срок действия - напишите ваши собственные ActionResultметоды, если это необходимо
  • Подумайте об использовании RouteNameмаршрутов для организации маршрутов, а затем используйте их для генерации ссылок и старайтесь не использовать метод ActionLink на основе дерева выражений.
  • Рассмотрите возможность реализации стратегии кэширования разрешения маршрута.
  • Поместите повторяющийся код внутрь себя PartialViews, избегайте его рендеринга хххх раз: если вы в конечном итоге вызываете одни и те же частичные 300 раз в одном и том же виде, вероятно, что-то не так с этим. Объяснение и контрольные показатели

Маршрутизация

Безопасность

  • Используйте проверку подлинности с помощью форм, сохраняйте часто используемые конфиденциальные данные в билете проверки подлинности.

DAL

Балансировки нагрузки

  • Используйте обратные прокси-серверы, чтобы распределить нагрузку клиента на экземпляр вашего приложения. (Переполнение стека использует HAProxy ( MSDN ).

  • Используйте асинхронные контроллеры для реализации действий, которые зависят от обработки внешних ресурсов.

Сторона клиента

  • Оптимизируйте свою клиентскую сторону, используйте инструмент, такой как YSlow, для предложений по повышению производительности.
  • Используйте AJAX для обновления компонентов вашего пользовательского интерфейса, по возможности избегайте обновления всей страницы.
  • Рассмотрим реализацию архитектуры pub-sub -ie Comet- для доставки контента против перезагрузки, основанной на тайм-аутах.
  • Переместите логику построения графиков и графиков на клиентскую сторону, если это возможно. Генерация графиков - это дорогое занятие. Откладывая на стороне клиента ваш сервер от ненужной нагрузки и позволяя вам работать с графиками локально, не отправляя новый запрос (например, Flex charting , jqbargraph , MoreJqueryCharts ).
  • Используйте CDN для скриптов и медиа-контента, чтобы улучшить загрузку на стороне клиента (например, Google CDN )
  • Minify - Compile - ваш JavaScript для улучшения размера вашего скрипта
  • Сохраняйте размер файлов cookie небольшим, поскольку файлы cookie отправляются на сервер при каждом запросе.
  • Рассмотрите возможность использования DNS и предварительной выборки ссылок, когда это возможно.

Глобальная конфигурация

  • Если вы используете Razor, добавьте следующий код в ваш global.asax.cs, по умолчанию Asp.Net MVC визуализирует с механизмом aspx и механизмом бритвы. Это использует только RazorViewEngine.

    ViewEngines.Engines.Clear(); ViewEngines.Engines.Add(new RazorViewEngine());

  • Добавьте gzip (HTTP-сжатие) и статический кеш (images, css, ...) в ваш web.config <system.webServer> <urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true"/> </system.webServer>

  • Удалить неиспользуемые модули HTTP
  • Сбросьте ваш HTML, как только он сгенерирован (в вашем web.config) и отключите viewstate, если вы его не используете <pages buffer="true" enableViewState="false">

6
подождите, вы имеете в виду, что я теряю производительность, когда у меня, например, есть представление, которое отображает набор результатов путем раздражения через IList и вызывает Render.PartialView ("Row", item) для каждого элемента списка? сколько я теряю? или как я могу измерить прирост производительности?
marc.d

@SDReyes - в чем смысл архитектуры паб-суб ?
Мохаммед Замир

1
Это здорово. Ссылка на Uber Profiler не работает. Должно ли это быть связано с одним из специальных профилировщиков ORM?
Шанабус

12

Основное предложение состоит в том, чтобы следовать принципам REST, и следующие пункты связывают некоторые из этих принципов с каркасом ASP.NET MVC:

  1. Сделайте ваши контроллеры не имеющими состояния - это скорее предложение « веб- производительность / масштабируемость» (в отличие от производительности на микро / машинном уровне) и важное дизайнерское решение, которое повлияет на ваши приложения в будущем - особенно в случае, если оно станет популярным или если вам нужны некоторые отказоустойчивость например.
    • Не используйте сеансы
    • Не используйте tempdata - который использует сессии
    • Не пытайтесь «кешировать» все «преждевременно».
  2. Использовать проверку подлинности с помощью форм
    • Храните ваши часто используемые конфиденциальные данные в билете аутентификации
  3. Используйте куки для часто доступной не конфиденциальной информации
  4. Сделайте ваши ресурсы кэшируемыми в сети
  5. Скомпилируйте ваш JavaScript. Есть библиотека компилятора Closure, чтобы сделать это (конечно, есть и другие, просто найдите «компилятор JavaScript» )
  6. Используйте CDN (Content Delivery Network) - особенно для ваших больших медиа-файлов и так далее.
  7. Рассмотрите различные типы хранилищ для ваших данных, например, файлы, хранилища ключей / значений и т. Д. - не только SQL Server
  8. И последнее, но не менее важное: протестируйте свой веб-сайт на производительность

10

Code Climber и эта запись в блоге предоставляют подробные способы повышения производительности приложения.

Скомпилированный запрос увеличит производительность вашего приложения, но он не имеет ничего общего с ASP.NET MVC. Это ускорит каждое приложение БД, так что речь не идет о MVC.


8

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


6

При доступе к данным через LINQ полагаться на IQueryable ...

Зачем использовать AsQueryable () вместо List ()?

... и создайте хороший шаблон репозитория:

Загрузка подзаписей в шаблоне репозитория

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


6

Не потрясающая оптимизация, но я подумал, что я добавлю это - используйте CDN для jQuery и т . Д.

Цитата самого ScottGu: Microsoft Ajax CDN позволяет значительно повысить производительность веб-форм ASP.NET и приложений ASP.NET MVC, использующих ASP.NET AJAX или jQuery. Сервис доступен бесплатно, не требует регистрации и может использоваться как в коммерческих, так и в некоммерческих целях.

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


6

Также, если вы используете NHibernate, вы можете включить и настроить кэш второго уровня для запросов и добавить в область запросов и время ожидания. И есть EF , L2S и NHibernate - http://hibernatingrhinos.com/products/UberProf . Это поможет настроить ваши запросы.


Айенде недавно написал в блоге о том, как EF Profiler помог ему настроить пример приложения MVC: ayende.com/Blog/archive/2010/05/17/…
Фрэнк Швитерман,

5

Я также добавлю:

  1. Используйте спрайты : спрайты - это отличная вещь, чтобы уменьшить количество запросов. Вы объединяете все свои изображения в одно и используете CSS, чтобы получить большую часть спрайта. Microsoft предоставляет хорошую библиотеку для этого: Sprite и Image Optimization Preview 4 .

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

  3. Используйте ADO.NET вместо Entity Framework : EF4 or EF5отлично подходит для сокращения времени разработки, но оптимизировать его будет больно. Оптимизировать хранимую процедуру проще, чем Entity Framework. Таким образом, вы должны использовать процедуры магазина как можно больше. Dapper предоставляет простой способ запрашивать и отображать SQL с очень хорошей производительностью.

  4. Кэширование страницы или частичной страницы : MVC предоставляет простой фильтр для кэширования страницы по некоторым параметрам, поэтому используйте его.

  5. Сокращение вызовов базы данных : вы можете создать уникальный запрос к базе данных, который возвращает несколько объектов. Проверьте на сайте Dapper.

  6. Всегда иметь чистую архитектуру : иметь чистую многоуровневую архитектуру, даже для небольшого проекта. Это поможет вам сохранить ваш код в чистоте, и будет легче оптимизировать его при необходимости.

  7. Вы можете взглянуть на этот шаблон «Шаблон Neos-SDI MVC », который создаст для вас чистую архитектуру с множеством улучшений производительности по умолчанию (см. Веб- сайт MvcTemplate ).


Как вы думаете, лучше запустить одну хранимую процедуру, которая возвращает больше наборов результатов, чем запустить больше хранимых процедур в асинхронном режиме?
Muflix

4

В дополнение ко всей замечательной информации по оптимизации вашего приложения на стороне сервера, я бы сказал, что вам стоит взглянуть на YSlow . Это превосходный ресурс для повышения производительности сайта на стороне клиента.

Это относится ко всем сайтам, а не только к ASP.NET MVC.


3

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


2

1: получить сроки. Пока вы не знаете, где замедление, вопрос слишком широк, чтобы ответить. Проект, над которым я работаю, имеет именно эту проблему; Там нет регистрации, чтобы даже знать, как долго определенные вещи; мы можем только догадываться о медленных частях приложения, пока не добавим время к проекту.

2: Если у вас есть последовательные операции, не бойтесь слегка многопоточности. ОСОБЕННО, если задействованы блокирующие операции. PLINQ твой друг здесь.

3: Создайте свои представления MVC при публикации ... Это поможет с некоторыми "попаданиями на первую страницу"

4: Некоторые утверждают о преимуществах хранимой процедуры / ADO скорости. Другие приводят доводы в пользу скорости развития EF и более четкого разделения ярусов и их назначения. Я видел очень медленные разработки, когда SQL и обходные пути использования Sprocs / Views для извлечения и хранения данных. Кроме того, ваша сложность тестирования возрастает. Наша текущая кодовая база, которую мы конвертируем из ADO в EF, работает не хуже (а в некоторых случаях лучше), чем старая модель Hand-Rolled.

5: Это сказало, Подумайте о Разогреве приложения. Часть того, что мы делаем, чтобы помочь устранить большинство наших проблем производительности EF, заключалась в добавлении специального метода прогрева. Он не прекомпилирует какие-либо запросы или что-либо еще, но помогает в большей части загрузки / генерации метаданных. Это может быть еще более важно при работе с моделями Code First.

6: Как уже говорили другие, не используйте состояние сеанса или ViewState, если это возможно. Они не обязательно являются оптимизацией производительности, о которой думают разработчики, но как только вы начнете писать более сложные веб-приложения, вы захотите быстро реагировать. Состояние сеанса исключает это. Представьте себе длинный запрос. Вы решаете открыть новое окно и попробовать менее сложное. Что ж, возможно, вы также ждали с включенным состоянием сеанса, потому что сервер будет ждать, пока не будет выполнен первый запрос, прежде чем перейти к следующему для этого сеанса.

7: Минимизируйте поездки туда и обратно в базу данных. Сохраняйте вещи, которые вы часто используете, но реально не измените их в свой .Net Cache. Попробуйте пакетные ваши вставки / обновления, где это возможно.

7.1. Избегайте кода доступа к данным в представлениях Razor без чертовски веских причин. Я бы не сказал этого, если бы не видел это. Они уже обращались к своим данным, когда собирали модель, почему, черт возьми, они не включили ее в модель?


2
  1. Реализовать Gzip.
  2. Используйте асинхронный рендеринг для частичных представлений.
  3. Минимизируйте попадания в базу данных.
  4. Используйте скомпилированный запрос.
  5. Запустите профилировщик и найдите ненужные хиты. Оптимизируйте все хранимые процедуры, которые возвращают ответ более чем за 1 секунду.
  6. Используйте кеширование.
  7. Используйте оптимизацию минимизации пакетов .
  8. Используйте утилиты HTML 5, такие как кеш сеанса и локальное хранилище, для содержимого, доступного только для чтения.

2

Просто хотел добавить мои 2 цента. Самый эффективный способ оптимизировать генерацию URL-маршрута в приложении MVC - не создавать их вообще.

Большинство из нас более или менее знают, как URL генерируются в наших приложениях в любом случае, поэтому простое использование статического Url.Content("~/Blahblah")вместо Url.Action()или, Url.RouteUrl()где это возможно, превосходит все остальные методы почти в 20 раз и даже больше.

PS. Я провел тест из нескольких тысяч итераций и опубликовал результаты в своем блоге, если интересно.


1

В своем стремлении оптимизировать клиентскую часть не забывайте о уровне базы данных. У нас было приложение, которое ушло от 5 секунд, чтобы загрузить до 50 секунд за ночь.

При осмотре мы сделали целую кучу изменений схемы. Как только мы обновили статистику, она внезапно стала такой же отзывчивой, как и раньше.


0

Следующие вещи

  1. Кеш режима ядра
  2. Режим конвейера
  3. Удалить неиспользуемые модули
  4. runAllManagedModulesForAllRequests
  5. Не пишите в wwwroot
  6. Удалить неиспользуемые движки и язык просмотра

0

Использование Bundling and Minification также помогает вам улучшить производительность. Это в основном сокращает время загрузки страницы.


0

Если вы используете приложение ASP.NET MVC в Microsoft Azure (IaaS или PaaS), выполните следующие действия, по крайней мере, до первого развертывания.

  • Сканируйте свой код с помощью статического анализатора кода на наличие любых типов долгов кода, дублирования, сложности и безопасности.
  • Всегда включайте Application Insight и часто отслеживайте производительность, браузеры и аналитику, чтобы найти проблемы приложения в реальном времени.
  • Реализуйте Redis Cache Azure для статических и менее частых изменений данных, таких как изображения, ресурсы, общие макеты и т. Д.
  • Всегда полагайтесь на инструменты APM (Application Performance Management), предоставляемые Azure.
  • Часто просматривайте карту приложения, чтобы исследовать производительность связи между внутренними частями приложения.
  • Мониторинг производительности базы данных / ВМ тоже.
  • При необходимости используйте балансировщик нагрузки (горизонтальная шкала) и в рамках бюджета.
  • Если у вашего приложения целевая аудитория по всему миру, используйте Azure Trafic Manager, чтобы автоматически обработать входящий запрос и перенаправить его в наиболее доступный экземпляр приложения.
  • Попробуйте автоматизировать мониторинг производительности, написав предупреждения, основанные на низкой производительности.

0

Используйте последнюю версию Task Parallel Library (TPL) , в соответствии с версией .Net. Приходится выбирать правильные модули TPL для разных целей.


0

Я сделал все ответы выше, и это просто не решило мою проблему.

Наконец, я решил проблему медленной загрузки сайта, установив для параметра PrecompileBeforePublish в профиле публикации значение true . Если вы хотите использовать msbuild, вы можете использовать этот аргумент:

 /p:PrecompileBeforePublish=true

Это действительно очень помогает. Теперь мой MVC ASP.NET загружается в 10 раз быстрее.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.