Как улучшить производительность приложения ASP.NET MVC?
Как улучшить производительность приложения ASP.NET MVC?
Ответ 1
Скомпилированный список возможных источников улучшения приведен ниже:
Общие
- Используйте профилировщик для обнаружения утечек памяти и проблем с производительностью в вашем приложении. лично я предлагаю dotTrace
- Запустите свой сайт в режиме Release, а не в режиме отладки, когда в процессе производства, а также во время профилирования производительности. Режим выпуска намного быстрее. Режим отладки может скрыть проблемы с производительностью в вашем собственном коде.
Кэширование
- Используйте
CompiledQuery.Compile()
рекурсивно избегая перекомпиляция вашего запроса Выражения - Кэш не подвержен изменениям
с использованием
OutputCacheAttribute
сохранить ненужные и действия казни - Использовать файлы cookie для часто запрашиваемой нечувствительной информации.
- Использовать ETags и истечение срока действия - при необходимости создайте свои собственные методы
ActionResult
- Рассмотрите возможность использования
RouteName
для организации ваших маршрутов, а затем используйте его для генерации ваши ссылки и старайтесь не использовать метод ActionLink на основе дерева выражений. - Подумайте о реализации стратегии кэширования разрешений маршрута
- Поместите повторяющийся код внутри
PartialViews
, избегайте рендера xxxx раз: если вы в конечном итоге вызывая тот же частичный 300 раз в одном и том же представлении, возможно, что-то есть неправильно с этим. Объяснение и контрольные показатели
Routing
-
Используйте
Url.RouteUrl("User", new { username = "joeuser" })
для указания маршрутов. ASP.NET MVC Perfomance Руди Бенковича -
Разрешение кэширования маршрута с использованием этого помощника
UrlHelperCached
ASP.NET MVC Perfomance by Rudi Benkovic
Безопасность
- Использовать проверку подлинности с помощью форм. Храните часто используемые конфиденциальные данные в аутентификационный билет
DAL
- При доступе к данным через LINQ полагайтесь на IQueryable
- Использовать шаблон хранилища
- Профилируйте свои запросы, т.е. Uber Profiler
- Рассмотрим кэш второго уровня для ваших запросов и добавьте им область действия и тайм-аут, т.е. NHibernate Second Cache
Балансировка нагрузки
-
Используйте обратные прокси, чтобы распространять нагрузку клиента на экземпляр вашего приложения. (Qaru использует HAProxy (MSDN).
-
Используйте Асинхронные контроллеры для реализации действий, зависящих от обработки внешних ресурсов.
Клиентская сторона
- Оптимизируйте свою клиентскую сторону, используйте инструмент YSlow для предложения по повышению производительности
- Используйте AJAX для обновления компонентов вашего пользовательского интерфейса, избегайте обновления всей страницы, когда это возможно.
- Рассмотрите возможность реализации архитектуры pub-sub -i.e. Комета - для доставки контента против перезагрузка, основанная на тайм-аутах.
- Если возможно, переместите графику и схему генерации графа на клиентскую сторону. Генерация графиков это дорогостоящая деятельность. Откладывая на стороне клиента ваш сервер из ненужное бремя, и позволяет работать с графиками локально, не создавая новых запрос (т.е. графическое отображение Flex, jqbargraph, MoreJqueryCharts).
- Используйте CDN для сценариев и медиаконтента, чтобы улучшить загрузку на стороне клиента (т.е. Google CDN)
- Minify - Compile - ваш JavaScript, чтобы улучшить размер script
- Сохраняйте размер файла cookie маленьким, поскольку файлы cookie отправляются на сервер по каждому запросу.
- По возможности используйте DNS и ссылку Prefetching.
Глобальная конфигурация
-
Если вы используете 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">
Ответ 2
Основное предложение - следовать принципам REST, и следующие пункты связывают некоторые из этих принципов с каркасом ASP.NET MVC:
- Создайте свои контроллеры stateless - это скорее предложение "Производительность/масштабируемость" (в отличие от производительности микро/машинного уровня) и основное дизайнерское решение, которое повлияет на ваши приложения в будущем - особенно в том случае, если оно станет популярным или, если вам нужна некоторая отказоустойчивость, например.
- Не использовать сеансы
- Не используйте tempdata - который использует сеансы
- Не пытайтесь "кэшировать" все "преждевременно".
- Используйте Аутентификация форм
- Храните ваши часто используемые конфиденциальные данные в билет аутентификации
- Использовать файлы cookie для часто запрашиваемой нечувствительной информации.
- Сделайте ресурсы cachable в Интернете
- Использовать ETags
- Использовать срок действия
- При необходимости напишите свои собственные классы ActionResult
- Использовать обратные прокси
- Скомпилируйте свой JavaScript. Имеется библиотека компилятора Closure, чтобы сделать это (обязательно есть другие, просто ищите "компилятор JavaScript" )
- Использовать CDN (сеть доставки контента) - особенно для ваших больших медиафайлов и т.д.
- Рассмотрим различные типы хранилища для ваших данных, например, файлы, хранилища ключей/значений и т.д. - не только SQL Server
- И последнее, но не менее важное: проверьте свой веб-сайт на производительность
Ответ 3
Code Climber и эта запись в блоге подробные способы повышения производительности приложений.
Скомпилированный запрос увеличит производительность вашего приложения, но он не имеет ничего общего с ASP.NET MVC. Это ускорит каждое приложение db, так что это не действительно о MVC.
Ответ 4
Это может показаться очевидным, но запустите ваш сайт в режиме Release, а не в режиме Debug, когда он работает, а также во время профилирования производительности. Режим выпуска намного быстрее. Режим отладки может скрыть проблемы с производительностью в вашем собственном коде.
Ответ 5
Не потрясающая оптимизация, но я подумал, что я выброшу это - Использовать CDN для jQuery и т.д..
Цитата из самого ScottGu: Microsoft Ajax CDN позволяет значительно повысить производительность ASP.NET Web Forms и ASP.NET MVC приложения, использующие ASP.NET AJAX или jQuery. Услуга предоставляется бесплатно, не требует никакой регистрации и может использоваться как в коммерческих целях, так и в некоммерческих целях.
Мы даже используем CDN для наших веб-сайтов в Моссе, которые используют jQuery.
Ответ 6
При доступе к данным через LINQ полагаются на IQueryable...
Зачем использовать AsQueryable() вместо List()?
... и добавьте хороший шаблон репозитория:
Загрузка субкокков в шаблон хранилища
Это оптимизирует доступ к данным для обеспечения загрузки только необходимых данных и только тогда, когда это необходимо.
Ответ 7
Также, если вы используете NHibernate, вы можете включить и настроить кеш второго уровня для запросов и добавить к области запросов и тайм-ауту. И есть профайлер для задницы для EF, L2S и NHibernate - http://hibernatingrhinos.com/products/UberProf. Это поможет настроить ваши запросы.
Ответ 8
Я также добавлю:
-
Использовать спрайты. Спрайты - отличная вещь, чтобы уменьшить запрос. Вы объединяете все свои изображения в один и используете CSS для достижения хороших часть спрайта. Microsoft предоставляет хорошую библиотеку для этого: Предварительный просмотр оптимизатора и оптимизации изображений
-
Кэш Ваш серверный объект. Если у вас есть списки ссылок или данные, которые будут редко меняться, вы можете кэшировать их в память, а не запрашивать базу данных каждый раз.
-
Использование ADO.NET вместо Entity Framework:
EF4 or EF5
отлично подходит для сокращения времени разработки, но это будет больно для оптимизации. Проще оптимизировать хранимую процедуру, чем Entity Фреймворк. Поэтому вы должны максимально использовать процедуры хранилища. Dapper предоставляет простой способ запроса и сопоставления SQL с очень хорошим производительность. -
Страница кэширования или частичная страница. MVC предоставляет некоторый простой фильтр для кэширования страницы в соответствии с некоторыми параметрами, поэтому используйте ее.
-
Сократить вызовы базы данных. Вы можете создать уникальный запрос базы данных, который возвращает несколько объектов. Проверьте сайт Dapper.
-
Всегда иметь чистую архитектуру: иметь чистую архитектуру n-уровня, даже в небольшом проекте. Это поможет вам сохранить ваш код в чистоте, и при необходимости будет легче его оптимизировать.
-
Вы можете посмотреть этот шаблон " Шаблон Neos-SDI MVC" который создаст для вас чистую архитектуру с большим количеством производительность по умолчанию (проверьте MvcTemplate веб-сайт).
Ответ 9
В дополнение ко всей большой информации об оптимизации вашего приложения на стороне сервера, я бы сказал, что вы должны взглянуть на YSlow. Это превосходный ресурс для улучшения производительности сайта на стороне клиента.
Это относится ко всем сайтам, а не только к ASP.NET MVC.
Ответ 10
Один очень простой способ - это асинхронно думать, обращаясь к данным, которые вы хотите использовать для этой страницы. Независимо от того, читаете ли вы из веб-службы, файла, базы данных или чего-то еще, используйте как можно больше асинхронную модель. Хотя это не обязательно поможет какой-либо одной странице быть быстрее, это поможет вашему серверу работать в целом.
Ответ 11
1: Получить тайминги. Пока вы не знаете, где происходит замедление, вопрос слишком широк, чтобы ответить. У проекта, над которым я работаю, есть эта точная проблема; Там нет регистрации, чтобы даже знать, как долго некоторые вещи берут; мы можем только догадываться о медленных частях приложения, пока не добавим тайминги к проекту.
2: Если у вас есть последовательные операции, не бойтесь слегка многопоточности. ОСОБЕННО, если задействованы операции блокировки. PLINQ - ваш друг здесь.
3: Pregenerate ваши MVC-представления при публикации... Это поможет с некоторыми из "первых постраничных страниц"
4: Некоторые утверждают, что для скорости хранения сохранена процедура /ADO. Другие утверждают, что скорость развития EF и более четкое разделение ярусов и их цель. Я видел очень медленные проекты, когда SQL и обходные пути используют Sprocs/Views для извлечения и хранения данных. Кроме того, ваша трудность в тестировании повышается. Наша текущая кодовая база, которую мы конвертируем из ADO в EF, хуже не работает (а в некоторых случаях и лучше), чем старая модель с ручным управлением.
5: Это говорит, подумайте о приложении Warmup. Часть того, что мы делаем, чтобы помочь устранить большую часть наших проблем с производительностью EF, заключалась в том, чтобы добавить специальный метод разминки. Он не прекомпилирует какие-либо запросы или что-то еще, но это помогает с большей частью загрузки/генерации метаданных. Это может быть еще более важным при работе с моделями Code First.
6: Как говорили другие, не используйте сеансовое состояние или ViewState, если это возможно. Они не обязательно являются оптимизацией производительности, о которой думают разработчики, но как только вы начинаете писать более сложные веб-приложения, вам нужна отзывчивость. Состояние сеанса исключает это. Представьте длинный запрос. Вы решили открыть новое окно и попробовать менее сложную. Ну, вы также можете подождать с состоянием сеанса, потому что сервер будет ждать, пока первый запрос не будет выполнен, прежде чем переходить к следующему для этого сеанса.
7: Минимизировать круглые поездки в базу данных. Сохраните материал, который вы часто используете, но не сможете реально изменить ваш .Net Cache. По возможности постарайтесь вставлять свои вставки/обновления.
7.1: Избегайте доступа к коду доступа к данным в ваших Razor без лишней веской причины. Я бы не сказал этого, если бы не увидел его. Они уже получали доступ к своим данным при объединении модели, почему, черт возьми, они не включали ее в модель?
Ответ 12
- Внедрить Gzip.
- Используйте асинхронный рендеринг для частичных представлений.
- Минимизировать удаленные базы данных.
- Используйте скомпилированный запрос.
- Запустите профайлер и найдите ненужные удары. Оптимизируйте все хранимые процедуры, которые занимают более 1 секунды, чтобы вернуть ответ.
- Используйте кеширование.
- Используйте оптимизацию объединения.
- Используйте утилиты HTML 5, такие как кеш сеанса и локальное хранилище для содержимого только для чтения.
Ответ 13
Просто хотел добавить свои 2 цента. Мощный способ оптимизации генерации URL-адреса в приложении MVC - это... не генерировать их вообще.
Большинство из нас более или менее знают, как URL-адреса генерируются в наших приложениях в любом случае, поэтому просто используя static Url.Content("~/Blahblah")
вместо Url.Action()
или Url.RouteUrl()
, где это возможно, превосходит все остальные методы почти в 20 раз и даже больше.
PS. Я выполнил контрольный показатель в несколько тысяч итераций и опубликовал результаты в своем блоге, если это интересно.
Ответ 14
В своем требовании для оптимизации клиентской стороны не забывайте о слое базы данных. У нас было приложение, которое длилось от 5 секунд до момента загрузки до 50 секунд в течение ночи.
При проверке мы сделали целую кучу изменений схемы. Как только мы обновили статистику, она внезапно стала такой же отзывчивой, как раньше.
Ответ 15
Вот что делать
- Кэш-память режима
- Режим трубопровода
- Удалить неиспользуемые модули
- runAllManagedModulesForAllRequests
- Не пишите в wwwroot
- Удалить неиспользуемые механизмы просмотра и язык.
Ответ 16
Использование Bundling and Minification также помогает вам улучшить производительность. Это в основном снижает время загрузки страницы.
Ответ 17
Если вы запускаете приложение ASP.NET MVC в Microsoft Azure (IaaS или PaaS), сделайте следующее по крайней мере до первого развертывания.
- Сканируйте свой код с помощью статического анализатора кода на предмет наличия долгов, дублирования, сложности и безопасности кода.
- Всегда включайте Application Insight и часто отслеживайте производительность, браузеры и аналитику, чтобы найти проблемы приложения в реальном времени.
- Внедрите Redis Cache Azure для статических и менее частых изменений данных, таких как изображения, ресурсы, общие макеты и т.д.
- Всегда полагайтесь на инструменты APM (Application Performance Management), предоставляемые Azure.
- Часто просматривайте карту приложения, чтобы исследовать производительность связи между внутренними частями приложения.
- Отслеживайте производительность базы данных/виртуальной машины тоже.
- При необходимости используйте балансировщик нагрузки (горизонтальная шкала) и в рамках бюджета.
- Если у вашего приложения целевая аудитория по всему миру, используйте Azure Trafic Manager, чтобы автоматически обработать входящий запрос и перенаправить его в наиболее доступный экземпляр приложения.
- Попробуйте автоматизировать мониторинг производительности, написав оповещения на основе низкой производительности.
Ответ 18
Используйте последнюю версию Task Parallel Library (TPL), в соответствии с версией .Net. Приходится выбирать правильные модули TPL для разных целей.
Ответ 19
Я сделал все ответы выше, и это просто не решило мою проблему.
Наконец, я решил проблему медленной загрузки сайта, установив PrecompileBeforePublish в Опубликовать профиль в true. Если вы хотите использовать msbuild, вы можете использовать этот аргумент:
/p:PrecompileBeforePublish=true
Это действительно очень помогает. Теперь мой MVC ASP.NET загружается в 10 раз быстрее.