Подтвердить что ты не робот

Частично просматриваются частичные представления 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?

4b9b3361

Ответ 1

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

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

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

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

to:

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

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

Ответ 2

Я предполагаю, что ответ... это зависит?

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

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

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

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

Ответ 3

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