ASP.NET MVC局部视图速度慢?

21

我刚好检查了我们正在构建的一个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使用了一次?


所以,你的问题是:部分视图比内联内容慢吗?对此你已经有了答案。 :) - bzlm
问题是是否可能获得与Webforms相同的性能。 - Jan Zich
3
请看这篇文章,它解决了我的问题 http://mattias-jakobsson.net/post/2010/10/27/Performance-of-HtmlRenderPartial.aspx - John
3个回答

12

我刚刚将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
我猜答案是...这要看情况?
局部视图会降低性能(实际调用的开销等)。
局部视图不会被缓存。
在循环中包含局部视图会降低性能,并且可以通过将循环移动到局部视图中来加速。
可以在这里找到一些参考资料(其中引用了视图路径的缓存)。

2
真正的性能瓶颈是递归部分视图。虽然在某些情况下(如树形菜单)确实是一个合适的概念,但当我最后尝试时,性能出乎意料地恶化得更糟。 - bzlm

1

60毫秒是如此短的时间间隔,对我来说听起来像是统计噪音,而不是性能差异的确凿证据。


我在嵌套排列的partial视图/ DisplayTemplates方面遇到了性能问题。我的应用程序的着陆页面需要5-10秒才能呈现(取决于数据量)。我尝试使用debug=false和完整路径来减少查找时间,现在已删除了部分视图和显示模板,并将所有razor内联到单个视图中。这是一个非常重要的页面,有许多级别的嵌套元素。在其余的时间里,我喜欢使用displaytemlates和partial视图,但在这种情况下,我需要将它们优化掉。 - MemeDeveloper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接