|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
在经过全球个人PC市场占有90%的微软对asp.net不断优化与整合后,asp.net与微软自身平台的动用上更加的高效,加上asp.net在应用上非常容易上手,相信asp.net仍会是最多客户选用的脚本语言,并会在未来几年继续领跑。在ASP.NETMVC中,HtmlHelper的扩大办法RenderPartial为我们利用UserControl带来了极年夜的便利,当我们指定一个UserControl时,RenderPartial会在以后View文件夹下查找响应的UserControl,假如没有找到则会到Shared文件夹下查找。然后在利用RenderPartial办法有一些功能方面的思索,值得我们往存眷。
假想有如许一个场景,一篇文章有良多个批评,在页面中我们必要出现出一个批评列表,天然我们会界说一个批评的UserControl,以下代码所示:
Code1:- <%@ControlLanguage="C#"Inherits="System.Web.Mvc.ViewUserControl<Comment>"%><%@ImportNamespace="TerryLee.MvcPerformance01.Models"%><p>ID:<%=Model.ID%><br/>Author:<%=Model.Author%><br/>Description:<%=Model.Description%></p><hr/>
复制代码 在页面中出现批评列表,代码十分复杂,仅仅是遍历一切的批评罢了:
Code2:- <div><%foreach(varcommentinModel.Comments){Html.RenderPartial("CommentsItem",comment);}%></div>
复制代码 运转后效果以下,能够看到准确的输入了批评:
功能优化1
但是当我们同时输入200条批评的时分,却要消费大批的工夫,用Stopwatch来丈量一下会发明,输入200条批评消费的工夫基础在210ms摆布,也就是说均匀每条批评的输入消费了1ms。我们无妨看一下ASP.NETMVC的源代码,在WebFormViewEngine中当查找UserControl时,遵守以下查找形式:
Code3:- publicWebFormViewEngine(){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的完整路径,是否是能够制止这个查找历程呢?修正Code2代码以下所示:
Code4:- <div><%foreach(varcommentinModel.Comments){Html.RenderPartial("~/Views/Shared/CommentsItem.ascx",comment);}%></div>
复制代码 如今再测试一下会发明出现200条批评的工夫均匀值坚持在10ms摆布,比后面的体例提拔了近200ms。但是我们是不是真的找到懂得决成绩的办法?ASP.NETMVC岂非不合错误查找的View路径举行缓存?带着如许的疑问,我们在ASP.NETMVC源代码VirtualPathProviderViewEngine的机关函数中,找到如许一段代码:
Code5:- protectedVirtualPathProviderViewEngine(){if(HttpContext.Current==null||HttpContext.Current.IsDebuggingEnabled){ViewLocationCache=DefaultViewLocationCache.Null;}else{ViewLocationCache=newDefaultViewLocationCache();}}
复制代码 这里的判别申明假如启用了Debug形式,将会利用NullViewLocationCache,即不举行缓存,不然会利用DefaultViewLocationCache对View路径举行缓存。以是下面的测试了局都是基于Debug形式:
Code6:- <compilationdebug="true">
复制代码 假如封闭了Debug形式,测试了局又该怎样呢?利用上面代码封闭Debug形式:
Code7:- <compilationdebug="false">
复制代码 再次举行测试,会发明利用Code2代码出现200条批评时,消费的工夫均匀值也是在10ms摆布。以是在利用RenderPartial办法时,年夜可不用为了提拔功能而指定UserControl的完整路径,ASP.NETMVC已为我们做好了这统统,我们要做的仅仅是在公布到临盆情况时,别忘了封闭Debug形式!在本示例中,开启Debug和封闭Debug形式在一次挪用时的功能差异以下图所示:
功能优化2
如今回过火来看后面的代码,实在并没有做甚么功能优化,仅仅时给人人提个醒罢了。在Code2中,我们的遍历代码放在了主页面中,即在每次迭代中挪用RenderPartial办法,只管ASP.NETMVC在RenderPartial时,关于UserControl路径做了缓存,可是200次的挪用仍旧有不小的开支。假如我们的遍历代码放在UserControl中,而在主页面中只举行一次挪用RenderPartial办法,了局又将怎样呢?修正UserControl为下代码所示:
Code8:- <%@ControlLanguage="C#"Inherits="System.Web.Mvc.ViewUserControl<IList<Comment>>"%><%@ImportNamespace="TerryLee.MvcPerformance01.Models"%><%foreach(CommentcommentinModel){%><p>ID:<%=comment.ID%><br/>Author:<%=comment.Author%><br/>Description:<%=comment.Description%></p><%}%><hr/>
复制代码 如许在主页面中,只举行一次RenderPartial挪用,以下代码所示:
我以前很喜欢Serv-U,自从它用net网页编程重写之后我就再也没用过,实在是太慢了,我宁可用IIS搭建FTP,虽然IIS搭建FTP在权限管理上很不灵活。 |
|