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

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

16 ответов


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

общие

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

кэширование

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

маршрут

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

  • используйте проверку подлинности форм, держите часто доступ конфиденциальные данные в билет аутентификации

даль

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

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

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

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

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

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

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

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

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

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

Альпинист Код и запись в блоге предоставьте подробные способы повышения производительности приложения.

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


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

  1. сделать ваши контроллеры - это больше 'Web предложение производительности / масштабируемости (в отличие от производительности микро / машинного уровня) и важное дизайнерское решение, которое повлияет на ваше будущее приложений - особенно в случае, если оно станет популярным или если вам нужна ошибка например, терпимость.
    • не использовать сессии
    • не используйте tempdata-который использует сеансы
    • Не пытайтесь "кэшировать" все "преждевременно".
  2. использовать Проверка Подлинности С Помощью Форм
    • храните ваши часто доступные конфиденциальные данные в билете аутентификации
  3. используйте cookies для часто доступной не конфиденциальной информации
  4. сделать ваши cachable ресурсов в интернете
  5. скомпилируйте свой JavaScript. существует библиотека компилятора закрытия чтобы сделать это (конечно есть и другие, просто найдите "JavaScript compiler" тоже)
  6. Использовать CDNs (Сеть доставки контента) - особенно для больших медиа-файлов и так далее.
  7. рассмотрите различные типы хранения ваших данных,например, файлы, хранилища ключей / значений и т. д. - не только SQL Server
  8. и последнее, но не менее важное: проверьте свой веб-сайт на производительность

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


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

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

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

Subrecords загрузки в шаблон репозитория

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


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

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

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


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


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

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

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

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

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

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

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

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


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

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


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


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

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

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

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

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

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

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

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


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

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

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


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

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


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

такие вещи делать

  1. кэш режима ядра
  2. режим трубопровода
  3. удалить неиспользуемые модули
  4. runAllManagedModulesForAllRequests
  5. не пишите в wwwroot
  6. удалить неиспользуемые двигатели просмотра и язык

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