Как мне улучшить ASP.NET производительность приложения MVC?
Как вы улучшаете свой ASP.NET производительность приложения MVC?
16 ответов
ниже приведен список возможных источников улучшения:
общие
- используйте профилировщик для обнаружения утечек памяти и проблем с производительностью в приложении. лично я предлагаю dotTrace
- запуск сайта в режиме выпуска, а не отладки, Когда в производстве, а также во время профилирования производительности. Режим выпуска намного быстрее. Режим отладки может скрыть проблемы производительности в вашем собственном код.
кэширование
- использовать
CompiledQuery.Compile()
рекурсивно избегая перекомпиляция запроса выражения - кэш не подвержен изменениям
содержание с помощью
OutputCacheAttribute
чтобы сохранить ненужное и действие казни - используйте cookies для часто доступной не конфиденциальной информации
- использовать теги ETag и срок действия-напишите свой заказ
ActionResult
методы при необходимости - рассмотреть с помощью
RouteName
для организации маршрутов, а затем использовать его для создания ваши ссылки и старайтесь не использовать метод ActionLink на основе дерева выражений. - рассмотрите возможность реализации стратегии кэширования разрешения маршрута
- поставить повторяющийся код внутри
PartialViews
, не сделать его xxxx раз: если вы в конечном итоге вызов одного и того же частичного 300 раз в том же представлении, вероятно, есть что-то это неправильно. Объяснение И Контрольные показатели
маршрут
использовать
Url.RouteUrl("User", new { username = "joeuser" })
для указания маршрутов. ASP.NET выступление MVC Руди Бенковичаразрешение маршрута кэша с помощью этого помощника
UrlHelperCached
ASP.NET выступление MVC Руди Бенковича
безопасность
- используйте проверку подлинности форм, держите часто доступ конфиденциальные данные в билет аутентификации
даль
- при доступе к данным через LINQ положитесь на IQueryable
- использовать шаблон репозитория
- профилируйте свои запросы, т. е. Uber Profiler
- рассмотрим кэш второго уровня для ваших запросов и добавьте им область и тайм-аут, т. е. NHibernate Второй Кэш
балансировки нагрузки
используйте обратные прокси, чтобы распределить нагрузку клиента по вашему экземпляру приложения. (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:
- сделать ваши контроллеры - это больше 'Web предложение производительности / масштабируемости (в отличие от производительности микро / машинного уровня) и важное дизайнерское решение, которое повлияет на ваше будущее приложений - особенно в случае, если оно станет популярным или если вам нужна ошибка например, терпимость.
- не использовать сессии
- не используйте tempdata-который использует сеансы
- Не пытайтесь "кэшировать" все "преждевременно".
- использовать Проверка Подлинности С Помощью Форм
- храните ваши часто доступные конфиденциальные данные в билете аутентификации
- используйте cookies для часто доступной не конфиденциальной информации
- сделать ваши cachable ресурсов в интернете
- Использовать ETags
- использовать срок годности
- при необходимости напишите свои пользовательские классы ActionResult
- использовать обратный прокси
- скомпилируйте свой JavaScript. существует библиотека компилятора закрытия чтобы сделать это (конечно есть и другие, просто найдите "JavaScript compiler" тоже)
- Использовать CDNs (Сеть доставки контента) - особенно для больших медиа-файлов и так далее.
- рассмотрите различные типы хранения ваших данных,например, файлы, хранилища ключей / значений и т. д. - не только SQL Server
- и последнее, но не менее важное: проверьте свой веб-сайт на производительность
Это может показаться очевидным, но Запустите свой сайт в режиме выпуска, а не в режиме отладки, Когда в производстве, а также во время профилирования производительности. Режим выпуска -много быстрее. Режим отладки может скрыть проблемы производительности в вашем собственном коде.
при доступе к данным через 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. Это поможет настроить ваши запросы.
Я тоже добавлю:
Использовать Спрайты: спрайты-отличная вещь, чтобы уменьшить запрос. Вы объединяете все свои изображения в один и используете CSS, чтобы получить хорошее часть спрайта. Microsoft предоставляет хорошую библиотеку для этого: Спрайт и оптимизация изображений предварительный просмотр 4.
кэшировать объект сервера: если у вас есть некоторые списки ссылок или данные, которые будут меняться редко, вы можете кэшировать их в память вместо того, чтобы каждый раз запрашивать базу данных.
использовать ADO.NET вместо Entity Framework:
EF4 or EF5
отлично подходят для сокращения времени разработки, но будет больно оптимизировать. Проще оптимизировать a хранимая процедура чем сущность Рамки. Поэтому вы должны использовать процедуры магазина как можно больше. Dapper предоставляет простой способ запроса и сопоставления SQL с очень хорошим спектакль.страница кэша или частичная страница: MVC предоставляет простой фильтр для кэширования страницы в соответствии с некоторыми параметрами, поэтому используйте его.
уменьшить вызовы базы данных: можно создать уникальный запрос базы данных, возвращающий несколько объектов. Проверьте на веб-сайте Dapper.
всегда иметь чистую архитектуры: имейте чистую архитектуру n-ярусов, даже на небольшом проекте. Это поможет вам сохранить ваш код чистым и будет легче оптимизировать если понадобится.
вы можете взглянуть на этот шаблон "шаблон 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 секунд за ночь.
при проверке мы сделали целую кучу изменений схемы. Как только мы обновили статистику, она внезапно стала такой же отзывчивой, как и раньше.
- Реализовать Gzip.
- используйте асинхронную отрисовку для частичных представлений.
- минимизировать попадания в базы данных.
- используйте скомпилированный запрос.
- запустите профилировщик и найдите ненужные хиты. Оптимизируйте все хранимые процедуры, которые занимают более 1 секунды для возврата ответа.
- использовать кэширование.
- использовать комплектация minification оптимизация.
- используйте утилиты HTML 5, такие как кэш сеанса и локальный хранение только для чтения содержимого.
такие вещи делать
- кэш режима ядра
- режим трубопровода
- удалить неиспользуемые модули
- runAllManagedModulesForAllRequests
- не пишите в wwwroot
- удалить неиспользуемые двигатели просмотра и язык
используя связывать и Minification также помогает вам улучшить представление. Это в основном сокращает время загрузки страницы.