Як покращити продуктивність програми ASP.NET MVC?


Відповіді:


311

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

Загальні

  • Скористайтеся профілером, щоб виявити витоки пам'яті та проблеми у вашій програмі. особисто пропоную dotTrace
  • Запускайте свій сайт у режимі випуску, а не в режимі налагодження, коли ви працюєте, а також під час профілювання продуктивності. Режим випуску набагато швидший. Режим налагодження може приховати проблеми з продуктивністю у власному коді.

Кешування

  • Використовуйте CompiledQuery.Compile() рекурсивно, уникаючи перекомпіляції виразів запитів
  • Кеш, не схильний до зміни вмісту, використовуючи OutputCacheAttribute для збереження непотрібних та дії
  • Використовуйте файли cookie для нечутливої ​​інформації, що часто отримується
  • Використовуйте ETags та термін придатності - ActionResultпри необхідності запишіть свої власні методи
  • Подумайте про те, RouteNameщоб організувати ваші маршрути, а потім використовувати їх для генерування ваших посилань, і намагайтеся не використовувати метод ActionLink на дереві виразів.
  • Подумайте про реалізацію стратегії кешування роздільної здатності маршруту
  • Покладіть повторюваний код всередину свого PartialViews, уникайте повторення xxxx разів: якщо ви в кінцевому підсумку викликаєте той самий частковий 300 разів в одному і тому ж представленні, ймовірно, в цьому щось не так. Пояснення та орієнтири

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

Безпека

  • Використовуйте автентифікацію форм, зберігайте ваші конфіденційні дані, які часто отримують доступ, у квитку для автентифікації

DAL

Балансування навантаження

  • Використовуйте зворотні проксі-сервери, щоб розповсюдити завантаження клієнта по вашому екземпляру програми. (Переповнення стека використовує HAProxy ( MSDN ).

  • Використовуйте асинхронні контролери для реалізації дій, які залежать від обробки зовнішніх ресурсів.

Сторона клієнта

  • Оптимізуйте клієнтську сторону, використовуйте такий інструмент, як YSlow, для пропозицій щодо підвищення продуктивності
  • Використовуйте AJAX для оновлення компонентів вашого інтерфейсу, уникайте оновлення цілої сторінки, коли це можливо.
  • Розгляньте можливість впровадити архітектуру pub-sub -ie Comet для доставки вмісту проти перезавантаження на основі тайм-аутів.
  • Перемістіть логіку складання графіків та графіків на сторону клієнта, якщо можливо. Генерація графіків - дорога діяльність. Відкликання вашого клієнта від непотрібного тягаря та дозволяє вам працювати з графіками локально, не роблячи нового запиту (наприклад, графік Flex, jqbargraph , MoreJqueryCharts ).
  • Використовуйте CDN для скриптів та медіа-вмісту для покращення завантаження на стороні клієнта (тобто Google CDN )
  • Minify - Compile - ваш 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">

6
зачекайте, ви маєте на увазі, що я втрачаю продуктивність, коли, наприклад, маю вигляд, який відображає набір результатів, дратуючись через IList і викликаючи Render.PartialView ("рядок", пункт) для кожного елемента списку? скільки я втрачаю? або як я міг оцінити підвищення продуктивності?
marc.d

@SDReyes - у чому сенс архітектури pub-sub ?
Мухаммед Замер

1
Це круто. Однак посилання Uber Profiler мертве. Чи слід це замість цього пов'язати з одним із конкретних профілів ORM?
шанабус

12

Основна пропозиція полягає у дотриманні принципів REST, а наведені нижче пункти пов'язують деякі з цих принципів у рамках ASP.NET MVC:

  1. Зробіть контролери без стану - це скоріше пропозиція щодо " веб- продуктивності / масштабованості" (на відміну від продуктивності на рівні мікро / машини) та важливого дизайнерського рішення, яке вплине на майбутнє ваших додатків - особливо у випадку, якщо воно стане популярним або вам потрібно наприклад, відмовостійкість.
    • Не використовуйте сеанси
    • Не використовуйте tempdata - для цього використовуються сеанси
    • Не намагайтеся "передчасно" все "кешувати".
  2. Використовуйте автентифікацію форм
    • Зберігайте ваші конфіденційні дані, які часто звертаються, у квитку для автентифікації
  3. Використовуйте файли cookie для нечутливої ​​інформації, що часто отримується
  4. Зробіть свої ресурси керованими в Інтернеті
  5. Складіть свій JavaScript. Для цього також є бібліотека компіляторів закриття (напевно що є й інші, просто шукайте також "компілятор JavaScript" )
  6. Використовуйте CDN (Network Delivery Network) - особливо для великих медіафайлів тощо.
  7. Розглянемо різні типи пам’яті для ваших даних, наприклад, файли, сховища ключів / цінностей тощо - не лише SQL Server
  8. І останнє, але не менш важливе, протестуйте свій веб-сайт на ефективність

10

Code Climber і цей запис у блозі надають детальні способи підвищення продуктивності програми.

Складений запит підвищить продуктивність вашої програми, але він не має нічого спільного з ASP.NET MVC. Це пришвидшить кожен db-додаток, тому мова йде не про MVC.


8

Це може здатися очевидним, але запускайте свій сайт у режимі випуску, а не в режимі налагодження, коли ви працюєте, а також під час профілювання продуктивності. Режим випуску набагато швидший. Режим налагодження може приховати проблеми з продуктивністю у власному коді.


6

Під час доступу до даних через LINQ покладайтеся на IQueryable ...

Навіщо використовувати AsQueryable () замість List ()?

... і використовуйте хороший зразок сховища:

Завантаження підзаписів у шаблоні репозиторію

Це дозволить оптимізувати доступ до даних, щоб забезпечити завантаження лише необхідних даних і тоді, коли вони потрібні.


6

Не оптимізація, що руйнує землю, але я подумав, що я викину це туди - Використовуйте CDN для jQuery тощо .

Цитата від самого СкотГу: CDN Microsoft Ajax дозволяє значно підвищити продуктивність ASP.NET Web Forms та ASP.NET MVC-додатків, які використовують ASP.NET AJAX або jQuery. Послуга доступна безкоштовно, не потребує жодної реєстрації і може використовуватися як для комерційних, так і для некомерційних цілей.

Ми навіть використовуємо CDN для своїх веб-частин в Moss, які використовують jQuery.


6

Крім того, якщо ви використовуєте NHibernate, ви можете увімкнути та налаштувати кеш другого рівня для запитів та додати до області запиту область та час очікування. А ще є профайлер для подушок для EF , L2S та NHibernate - http://hibernatingrhinos.com/products/UberProf . Це допоможе налаштувати ваші запити.


Нещодавно Ейенде розголосив, як EF Profiler допоміг йому налаштувати зразок програми MVC: ayende.com/Blog/archive/2010/05/17/…
Френк Швітерман

5

Я також додам:

  1. Використовуйте спрайт : спрайти - це чудова річ, щоб зменшити запит. Ви об’єднуєте всі свої зображення в одне ціле і використовуєте CSS, щоб дістатися до хорошої частини спрайту. Microsoft надає хорошу бібліотеку для цього: спрайт та оптимізація зображень Preview 4 .

  2. Кеш об'єкта вашого сервера : Якщо у вас є деякі списки посилань або дані, які змінюватимуться рідко, ви можете кешувати їх у пам'ять, а не запитувати базу даних кожен раз.

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

  4. Сторінка кешу або часткова сторінка : MVC надає простий фільтр для кешування сторінки за деякими параметрами, тому використовуйте її.

  5. Зменшення кількості дзвінків на базі даних : Ви можете створити унікальний запит до бази даних, який повертає кілька об'єктів. Перевірте на веб-сайті Dapper.

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

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


Чи вважаєте ви, що краще запустити одну збережену процедуру, яка повертає більше наборів результатів, аніж виконувати більше збережених процедур в режимі асинхронізації?
Muflix

4

На додаток до всієї чудової інформації щодо оптимізації вашої програми на стороні сервера, я б сказав, що вам слід поглянути на YSlow . Це чудовий ресурс для підвищення продуктивності сайту на стороні клієнта.

Це стосується всіх сайтів, не тільки ASP.NET MVC.


3

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


2

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

2: Якщо у вас є послідовні операції, не бійтеся злегка багатопотоково. ОСОБЛИВО, якщо задіяні операції блокування. PLINQ - ваш друг тут.

3: Підготуйте перегляди MVC під час публікації ... Це допоможе в деяких "зверненнях до першої сторінки"

4: Деякі аргументи щодо збереженої процедури / ADO переваги швидкості. Інші стверджують, що швидкість розвитку EF та більш чітке розділення рівнів та їх призначення. Я бачив дійсно повільні проекти, коли SQL і обхідні шляхи використовують Sprocs / Views для пошуку та зберігання даних. Крім того, ваші труднощі з тестуванням зростають. Наша нинішня база коду, яку ми перетворюємо з ADO в EF, не працює гірше (а в деяких випадках і краще), ніж стара модель Hand-Rolled.

5: Це сказав: Подумайте про програму Warmup. Частиною того, що ми робимо для усунення більшості наших неприємностей щодо ефективності, було додавання спеціального методу розминки. Він не попередньо компілює запити чи що-небудь інше, але це допомагає при завантаженні / генерації метаданих. Це може бути ще важливішим при роботі з моделями Code First.

6: Як уже говорили інші, не використовуйте стан сесії або ViewState, якщо можливо. Вони не обов'язково розробляють оптимізацію продуктивності, але коли ви починаєте писати складніші веб-додатки, ви хочете реагувати. Стан сесії це виключає. Уявіть тривалий запит. Ви вирішили відкрити нове вікно і спробувати менш складне. Що ж, можливо, ви дочекалися ввімкнення стану сеансу, тому що сервер буде чекати, поки буде виконаний перший запит, перш ніж перейти до наступного для цього сеансу.

7: Мінімізуйте туди і назад до бази даних. Збережіть речі, які ви часто використовуєте, але реально не зміняться у вашому .Net Cache. Спробуйте додати вставки / оновлення, де це можливо.

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


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

2

Просто хотів додати свої 2 копійки. НАЙБІЛЬШИЙ ефективний спосіб оптимізувати генерацію маршруту URL у додатку MVC - це… не генерувати їх взагалі.

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

PS. Я провів орієнтир у декількох тисячах ітерацій та опублікував результати у своєму блозі, якщо зацікавився.


1

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

Під час огляду ми внесли цілу купу змін в схему. Як тільки ми оновили статистику, вона раптом стала такою ж чуйною, як і раніше.


0

Далі слід зробити щось

  1. Кеш режиму ядра
  2. Трубопровідний режим
  3. Видаліть невикористані модулі
  4. runAllManagedModulesForAllRequests
  5. Не пишіть на wwwroot
  6. Видаліть невикористані двигуни перегляду та мову

0

Використання групи та мінімізації також допомагає покращити продуктивність. Це в основному скорочує час завантаження сторінки.


0

Якщо ви запускаєте додаток ASP.NET MVC на Microsoft Azure (IaaS або PaaS), то зробіть наступне, принаймні, до першого розгортання.

  • Скануйте свій код за допомогою аналізатора статичного коду на предмет будь-якого типу боргу, дублювання, складності та безпеки.
  • Завжди вмикайте програму Insight Application, а також слідкуйте за роботою, веб-переглядачами та аналітикою, щоб часто знаходити проблеми в програмі.
  • Застосуйте кеш Azure Redis для отримання статичних та рідкісних змін даних, таких як зображення, об’єкти, загальні макети тощо.
  • Завжди покладайтеся на інструменти APM (управління продуктивністю додатків), що надаються Azure.
  • Часто дивіться карту додатків, щоб вивчити ефективність зв'язку між внутрішніми частинами програми.
  • Монітор продуктивності бази даних / VM також.
  • Використовуйте балансир завантаження (горизонтальний масштаб), якщо потрібно і в межах бюджету.
  • Якщо у вашої програми є цільова аудиторія по всьому світу, тоді використовуйте Azure Trafic Manager, щоб автоматично обробляти вхідний запит і перенаправляти його до найбільш доступного екземпляра програми.
  • Спробуйте автоматизувати моніторинг ефективності, написавши попередження на основі низької продуктивності.

0

Використовуйте останню версію бібліотеки паралельних завдань (TPL) відповідно до версії .Net. Доводиться вибирати правильні модулі TPL для різних цілей.


0

Я зробив усі відповіді вище, і це просто не вирішило моєї проблеми.

Нарешті, я вирішив проблему з повільним завантаженням сайту, встановивши PrecompileBeforePublish у профілі публікації на true . Якщо ви хочете використовувати msbuild, ви можете використовувати цей аргумент:

 /p:PrecompileBeforePublish=true

Це дійсно дуже допомагає. Тепер мій MVC ASP.NET завантажується в 10 разів швидше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.