技术开发 频道

RenderPartial性能优化

  性能优化1

  然而当我们同时输出200条评论的时候, 却要花费大量的时间,用Stopwatch来测量一下会发现,输出200条评论花费的时间基本在210ms左右,也就是说平均每条评论的输出花费了1ms。我们不妨看一下ASP.NET MVC的源代码,在WebFormViewEngine中当查找UserControl时,遵循如下查找模式:

public WebFormViewEngine() {
    MasterLocationFormats
= new[] {
        
"~/Views/{1}/{0}.master",
        
"~/Views/Shared/{0}.master"
    };

    ViewLocationFormats
= new[] {
        
"~/Views/{1}/{0}.aspx",
        
"~/Views/{1}/{0}.ascx",
        
"~/Views/Shared/{0}.aspx",
        
"~/Views/Shared/{0}.ascx"
    };

    PartialViewLocationFormats
= ViewLocationFormats;
}

  所以如果我们在RenderPartial方法中,指定了UserControl的完全路径,是不是可以避免这个查找过程呢?修改Code 2代码如下所示:

<div>
  
<%
       foreach
(var comment in Model.Comments)
       {
           Html.RenderPartial("~/Views/Shared/CommentsItem.ascx", comment);
       }
     %
>
</div>

  现在再测试一下会发现呈现200条评论的时间平均值保持在10ms左右,比前面的方式提升了近200ms。然而我们是否真的找到了解决问题的方法?ASP.NET MVC难道不对查找的View路径进行缓存?带着这样的疑问,我们在ASP.NET MVC源代码VirtualPathProviderViewEngine的构造函数中,找到这样一段代码:

protected VirtualPathProviderViewEngine() {
    
if (HttpContext.Current == null || HttpContext.Current.IsDebuggingEnabled) {
        ViewLocationCache
= DefaultViewLocationCache.Null;
    }
    
else {
        ViewLocationCache
= new DefaultViewLocationCache();
    }
}

  这里的判断说明如果启用了Debug模式,将会使用NullViewLocationCache,即不进行缓存,否则会使用DefaultViewLocationCache对View路径进行缓存。所以上面的测试结果都是基于Debug模式:

<compilation debug="true">

  如果关闭了Debug模式,测试结果又该如何呢?使用下面代码关闭Debug模式:

<compilation debug="false">

  再次进行测试,会发现使用Code 2代码呈现200条评论时,花费的时间平均值也是在10ms左右。所以在使用RenderPartial方法时,大可不必为了提升性能而指定UserControl的完全路径,ASP.NET MVC已经为我们做好了这一切,我们要做的仅仅是在发布到生产环境时,别忘了关闭Debug模式!在本示例中,开启Debug和关闭Debug模式在一次调用时的性能差距如下图所示:

图2 优化数据对比
0
相关文章