ASP.NET MVC局部视图慢吗?

时间:2010-09-02 10:37:36

标签: asp.net-mvc partial-views

我碰巧检查了我们正在构建的ASP.NET MVC应用程序的性能。我打算将一个局部视图插入循环中,出于好奇,我检查了渲染页面所需的时间。结果并不好。

我需要做更多确凿的调查,但是如果有人有类似的问题或更多的洞察力,这就是我到目前为止所做的。首先,我应该说所有结果和测量都是在多次加载页面后完成的,并且我在web.config中设置了<compilation debug="false">

  • 似乎单个渲染部分会导致大约5ms的命中(至少在我的环境中)。当我内联部分视图的实际内容时,我几乎达到了0ms。
  • 当我将一个空的局部视图包含在一个约70个元素的循环中时,总渲染时间增加了约60ms。所以可能有一些缓存,但它并不理想。
  • 我调试了ASP.NET MVC,发现部分视图被缓存,但它只缓存到ascx的路径。然后,每次使用BuildManager.CreateInstanceFromVirtualPath方法实例化实际视图。
  • 现在有趣的是:当使用WebForms语法(<my:UserContol runat="server" />)包含相同的局部视图时,额外的60ms会消失。

基于上面的观察,似乎罪魁祸首是BuildManager.CreateInstanceFromVirtualPath方法。也许,这并不意味着多次被召唤。 Webforms可能不会使用它;或者以某种方式对每个ascx使用一次?

3 个答案:

答案 0 :(得分:10)

我刚刚将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秒,非常确凿的证据表明在调用部分视图时会有很大的开销。当你有一个电话时,我确信这是微不足道的,但是在一个循环中它会加起来所以我建议尽可能避免在循环中部分视图。

答案 1 :(得分:2)

我猜答案是......这取决于什么?

部分视图会降低性能(实际调用的开销等)。

不缓存部分视图。

在循环中包含局部视图会降低性能,并且可以通过在部分视图内部移动循环来再次加速。

可以找到一些示例读取(引用视图路径的缓存)here

答案 2 :(得分:1)

60ms这么小的间隔对我来说听起来像统计噪音,而不是性能差异的确凿证据。