Ответы:
Скомпилированный список возможных источников улучшения приведен ниже:
Общее
Кэширование
CompiledQuery.Compile()
рекурсивно, избегая перекомпиляции выражений вашего запросаOutputCacheAttribute
чтобы сохранить ненужные и выполняемые действияActionResult
методы, если это необходимоRouteName
маршрутов для организации маршрутов, а затем используйте их для генерации ссылок и старайтесь не использовать метод ActionLink на основе дерева выражений.PartialViews
, избегайте его рендеринга хххх раз: если вы в конечном итоге вызываете одни и те же частичные 300 раз в одном и том же виде, вероятно, что-то не так с этим. Объяснение и контрольные показателиМаршрутизация
Используйте Url.RouteUrl("User", new { username = "joeuser" })
для указания маршрутов. ASP.NET MVC Perfomance Руди Бенкович
Разрешение маршрута кэширования с помощью этого помощника UrlHelperCached
ASP.NET MVC Perfomance Руди Бенковича
Безопасность
DAL
Балансировки нагрузки
Используйте обратные прокси-серверы, чтобы распределить нагрузку клиента на экземпляр вашего приложения. (Переполнение стека использует HAProxy ( MSDN ).
Используйте асинхронные контроллеры для реализации действий, которые зависят от обработки внешних ресурсов.
Сторона клиента
Глобальная конфигурация
Если вы используете 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>
<pages buffer="true" enableViewState="false">
Основное предложение состоит в том, чтобы следовать принципам REST, и следующие пункты связывают некоторые из этих принципов с каркасом ASP.NET MVC:
Code Climber и эта запись в блоге предоставляют подробные способы повышения производительности приложения.
Скомпилированный запрос увеличит производительность вашего приложения, но он не имеет ничего общего с ASP.NET MVC. Это ускорит каждое приложение БД, так что речь не идет о MVC.
Это может показаться очевидным, но ваш сайт запускается в режиме выпуска, а не в режиме отладки, как в работе, так и во время профилирования производительности. Режим выпуска намного быстрее. Режим отладки может скрыть проблемы с производительностью в вашем собственном коде.
При доступе к данным через LINQ полагаться на IQueryable ...
Зачем использовать AsQueryable () вместо List ()?
... и создайте хороший шаблон репозитория:
Загрузка подзаписей в шаблоне репозитория
Это оптимизирует доступ к данным, чтобы гарантировать, что загружаются только те данные, которые необходимы, и только тогда, когда это необходимо.
Не потрясающая оптимизация, но я подумал, что я добавлю это - используйте CDN для jQuery и т . Д.
Цитата самого ScottGu: Microsoft Ajax CDN позволяет значительно повысить производительность веб-форм ASP.NET и приложений ASP.NET MVC, использующих ASP.NET AJAX или jQuery. Сервис доступен бесплатно, не требует регистрации и может использоваться как в коммерческих, так и в некоммерческих целях.
Мы даже используем CDN для наших веб-частей в Moss, которые используют jQuery.
Также, если вы используете NHibernate, вы можете включить и настроить кэш второго уровня для запросов и добавить в область запросов и время ожидания. И есть EF , L2S и NHibernate - http://hibernatingrhinos.com/products/UberProf . Это поможет настроить ваши запросы.
Я также добавлю:
Используйте спрайты : спрайты - это отличная вещь, чтобы уменьшить количество запросов. Вы объединяете все свои изображения в одно и используете CSS, чтобы получить большую часть спрайта. Microsoft предоставляет хорошую библиотеку для этого: Sprite и Image Optimization Preview 4 .
Кэширование объекта вашего сервера : если у вас есть списки ссылок или данные, которые будут редко меняться, вы можете кэшировать их в памяти вместо того, чтобы каждый раз запрашивать базу данных.
Используйте ADO.NET вместо Entity Framework : EF4 or EF5
отлично подходит для сокращения времени разработки, но оптимизировать его будет больно. Оптимизировать хранимую процедуру проще, чем Entity Framework. Таким образом, вы должны использовать процедуры магазина как можно больше. Dapper предоставляет простой способ запрашивать и отображать SQL с очень хорошей производительностью.
Кэширование страницы или частичной страницы : MVC предоставляет простой фильтр для кэширования страницы по некоторым параметрам, поэтому используйте его.
Сокращение вызовов базы данных : вы можете создать уникальный запрос к базе данных, который возвращает несколько объектов. Проверьте на сайте Dapper.
Всегда иметь чистую архитектуру : иметь чистую многоуровневую архитектуру, даже для небольшого проекта. Это поможет вам сохранить ваш код в чистоте, и будет легче оптимизировать его при необходимости.
Вы можете взглянуть на этот шаблон «Шаблон Neos-SDI MVC », который создаст для вас чистую архитектуру с множеством улучшений производительности по умолчанию (см. Веб- сайт MvcTemplate ).
В дополнение ко всей замечательной информации по оптимизации вашего приложения на стороне сервера, я бы сказал, что вам стоит взглянуть на YSlow . Это превосходный ресурс для повышения производительности сайта на стороне клиента.
Это относится ко всем сайтам, а не только к ASP.NET MVC.
Одна из супер простых вещей - думать асинхронно при доступе к нужным данным страницы. При чтении из веб-службы, файла, базы данных или чего-то еще, используйте асинхронную модель в максимально возможной степени. Хотя это не обязательно поможет одной странице быть быстрее, это поможет вашему серверу работать лучше в целом.
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 цента. Самый эффективный способ оптимизировать генерацию URL-маршрута в приложении MVC - не создавать их вообще.
Большинство из нас более или менее знают, как URL генерируются в наших приложениях в любом случае, поэтому простое использование статического Url.Content("~/Blahblah")
вместо Url.Action()
или, Url.RouteUrl()
где это возможно, превосходит все остальные методы почти в 20 раз и даже больше.
PS. Я провел тест из нескольких тысяч итераций и опубликовал результаты в своем блоге, если интересно.
В своем стремлении оптимизировать клиентскую часть не забывайте о уровне базы данных. У нас было приложение, которое ушло от 5 секунд, чтобы загрузить до 50 секунд за ночь.
При осмотре мы сделали целую кучу изменений схемы. Как только мы обновили статистику, она внезапно стала такой же отзывчивой, как и раньше.
Следующие вещи
Если вы используете приложение ASP.NET MVC в Microsoft Azure (IaaS или PaaS), выполните следующие действия, по крайней мере, до первого развертывания.
Я сделал все ответы выше, и это просто не решило мою проблему.
Наконец, я решил проблему медленной загрузки сайта, установив для параметра PrecompileBeforePublish в профиле публикации значение true . Если вы хотите использовать msbuild, вы можете использовать этот аргумент:
/p:PrecompileBeforePublish=true
Это действительно очень помогает. Теперь мой MVC ASP.NET загружается в 10 раз быстрее.