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