Как улучшить производительность приложений ASP.NET MVC? - PullRequest
209 голосов
/ 11 февраля 2010

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

Ответы [ 17 ]

304 голосов
/ 11 февраля 2010

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

Общее

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

Кэширование

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

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

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

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

DAL

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

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

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

Клиентская сторона

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

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

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

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

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

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

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

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

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

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

7 голосов
/ 05 августа 2010

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

6 голосов
/ 12 февраля 2010

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

6 голосов
/ 11 февраля 2010

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

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

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

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

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

6 голосов
/ 11 февраля 2010

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

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

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

5 голосов
/ 14 марта 2013

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

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

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

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

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

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

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

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

4 голосов
/ 12 февраля 2010

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

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

3 голосов
/ 12 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...