Частично просматриваются частичные представления 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?
Ответы
Ответ 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 мс - такой маленький интервал, который звучит как статистический шум для меня, а не убедительные доказательства разницы в производительности.