2010-09-02 5 views
19

Мне просто нужно проверить производительность приложения ASP.NET MVC, которое мы создаем. Я собирался вставить частичный вид в цикл, и только из любопытства я проверил, сколько времени потребовалось, чтобы отобразить страницу. Результат был неудачным.Частичный просмотр ASP.NET MVC медленный?

Мне нужно сделать более убедительное расследование, но на всякий случай был кто-то с похожими проблемами или более глубоким пониманием, вот что я до сих пор. Во-первых, я должен сказать, что все результаты и измерения были выполнены после нескольких загрузок страниц и что я установил <compilation debug="false"> в свой web.config.

  • Похоже, что один частичный рендеринг несет около 5 мс удара (по крайней мере, в моей среде). Когда я устанавливаю фактическое содержимое частичного представления, я получаю практически 0 мс.
  • Когда я включаю пустой частичный вид в петлю около 70 элементов, общее время рендеринга увеличивается на ~ 60 мс. Таким образом, существует некоторое кэширование, предположительно, но это не идеально.
  • Я отлаживал ASP.NET MVC и обнаружил, что частичные представления кэшируются, но он кэширует только пути к ascx. Фактические представления затем создаются каждый раз с использованием метода BuildManager.CreateInstanceFromVirtualPath.
  • И теперь интересный бит: если включить тот же частичный вид, используя синтаксис WebForms (<my:UserContol runat="server" />), дополнительные 60 мс уходят.

Таким образом, основываясь на наблюдениях выше, кажется, что виновником является метод BuildManager.CreateInstanceFromVirtualPath. Возможно, это не предназначалось для вызова несколько раз. Предполагается, что веб-формы не используют его; или использовать его как-то только один раз для каждого ascx?

+0

Итак, ваш вопрос: являются частичными представлениями медленнее, чем встроенный контент, на который у вас уже есть ответ. :) – bzlm

+0

Вопрос в том, можно ли получить такую ​​же производительность, как в Webforms. –

+3

60 мс не мешает мне. – jfar

ответ

2

Я угадываю, ответ ... это зависит?

Частичные виды снижают производительность (накладные расходы на фактический вызов и т. Д.).

Частичные виды не кешируются.

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

Некоторое выборочное чтение (которое ссылается на кеширование пути просмотра) можно найти here.

+2

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

2

60 мс - такой маленький интервал, который звучит как статистический шум для меня, а не убедительное доказательство разницы в производительности.

+0

У меня были проблемы с производительностью с частичным просмотром/DisplayTemplates, организованным вложенным способом. Целевая страница моего приложения занимала хорошие 5-10 секунд для рендеринга (в зависимости от данных). Я попробовал debug = false и полные пути для сокращения времени поиска, теперь удалили частичные и displaytemplates и поместили всю бритву inline в единое представление. Это на довольно тяжелой странице со множеством уровней вложенных элементов. В остальное время мне нравятся displaytemlates и частичные представления, но в этом случае мне нужно было их оптимизировать. – MemeDeveloper

8

Я только изменил вид MVC2 с использования частичного вида в цикле для одного вида, то есть:

<table> 
foreach(var a in items) 
{ 
    <%: Html.Partial("SomePartialView",a) %> 
} 
</table> 

Где SomePartialView содержит код для отображения одной строки в таблице, например, :

<tr><td>Model.Name</td><td>Model.description</td></tr> 

к:

foreach(var a in items) 
{ 
    <tr><td>a.Name</td><td>a.description</td></tr> 
} 

для зрения рендеринга 900 строк страницы, времени рендеринга спустились с 5+ минут загрузки страницы менее чем за 30 секунд, довольно убедительное доказательство того, что есть значительные издержки при вызове частичных представлений. Я уверен, что это незначительно, когда у вас есть один вызов, однако в цикле все это добавляется, поэтому я рекомендовал избегать частичных представлений в цикле, если это возможно.

Смежные вопросы