Частичное представление ASP.NET MVC медленно? - PullRequest
21 голосов
/ 02 сентября 2010

Я просто проверил производительность приложения 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?

Ответы [ 3 ]

10 голосов
/ 12 февраля 2012

Я только что изменил представление 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 секунд, что является довольно убедительным доказательствомэто значительные издержки при вызове частичных представлений.Я уверен, что это незначительно, когда у вас есть один вызов, однако в цикле все складывается, поэтому я рекомендовал бы по возможности избегать частичных представлений в цикле.

2 голосов
/ 02 сентября 2010

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

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

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

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

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

1 голос
/ 22 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...