仓酷云

标题: ASP.NET教程之ASP.NET MVC Performance Tips(1):RenderPartial功能优化仓酷云 [打印本页]

作者: 透明    时间: 2015-1-18 11:16
标题: ASP.NET教程之ASP.NET MVC Performance Tips(1):RenderPartial功能优化仓酷云
在经过全球个人PC市场占有90%的微软对asp.net不断优化与整合后,asp.net与微软自身平台的动用上更加的高效,加上asp.net在应用上非常容易上手,相信asp.net仍会是最多客户选用的脚本语言,并会在未来几年继续领跑。在ASP.NETMVC中,HtmlHelper的扩大办法RenderPartial为我们利用UserControl带来了极年夜的便利,当我们指定一个UserControl时,RenderPartial会在以后View文件夹下查找响应的UserControl,假如没有找到则会到Shared文件夹下查找。然后在利用RenderPartial办法有一些功能方面的思索,值得我们往存眷。
假想有如许一个场景,一篇文章有良多个批评,在页面中我们必要出现出一个批评列表,天然我们会界说一个批评的UserControl,以下代码所示:
Code1:
  1. <%@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:
  1. <div><%foreach(varcommentinModel.Comments){Html.RenderPartial("CommentsItem",comment);}%></div>
复制代码
运转后效果以下,能够看到准确的输入了批评:
ASP.NET教程之ASP.NET MVC Performance Tips(1):RenderPartial功能优化仓酷云
登录/注册后可看大图

功能优化1

但是当我们同时输入200条批评的时分,却要消费大批的工夫,用Stopwatch来丈量一下会发明,输入200条批评消费的工夫基础在210ms摆布,也就是说均匀每条批评的输入消费了1ms。我们无妨看一下ASP.NETMVC的源代码,在WebFormViewEngine中当查找UserControl时,遵守以下查找形式:
Code3:
  1. 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:
  1. <div><%foreach(varcommentinModel.Comments){Html.RenderPartial("~/Views/Shared/CommentsItem.ascx",comment);}%></div>
复制代码
如今再测试一下会发明出现200条批评的工夫均匀值坚持在10ms摆布,比后面的体例提拔了近200ms。但是我们是不是真的找到懂得决成绩的办法?ASP.NETMVC岂非不合错误查找的View路径举行缓存?带着如许的疑问,我们在ASP.NETMVC源代码VirtualPathProviderViewEngine的机关函数中,找到如许一段代码:
Code5:
  1. protectedVirtualPathProviderViewEngine(){if(HttpContext.Current==null||HttpContext.Current.IsDebuggingEnabled){ViewLocationCache=DefaultViewLocationCache.Null;}else{ViewLocationCache=newDefaultViewLocationCache();}}
复制代码
这里的判别申明假如启用了Debug形式,将会利用NullViewLocationCache,即不举行缓存,不然会利用DefaultViewLocationCache对View路径举行缓存。以是下面的测试了局都是基于Debug形式:
Code6:
  1. <compilationdebug="true">
复制代码
假如封闭了Debug形式,测试了局又该怎样呢?利用上面代码封闭Debug形式:
Code7:
  1. <compilationdebug="false">
复制代码
再次举行测试,会发明利用Code2代码出现200条批评时,消费的工夫均匀值也是在10ms摆布。以是在利用RenderPartial办法时,年夜可不用为了提拔功能而指定UserControl的完整路径,ASP.NETMVC已为我们做好了这统统,我们要做的仅仅是在公布到临盆情况时,别忘了封闭Debug形式!在本示例中,开启Debug和封闭Debug形式在一次挪用时的功能差异以下图所示:
ASP.NET教程之ASP.NET MVC Performance Tips(1):RenderPartial功能优化仓酷云
登录/注册后可看大图

功能优化2

如今回过火来看后面的代码,实在并没有做甚么功能优化,仅仅时给人人提个醒罢了。在Code2中,我们的遍历代码放在了主页面中,即在每次迭代中挪用RenderPartial办法,只管ASP.NETMVC在RenderPartial时,关于UserControl路径做了缓存,可是200次的挪用仍旧有不小的开支。假如我们的遍历代码放在UserControl中,而在主页面中只举行一次挪用RenderPartial办法,了局又将怎样呢?修正UserControl为下代码所示:
Code8:
  1. <%@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在权限管理上很不灵活。
作者: 莫相离    时间: 2015-1-19 17:42
提供基于组件、事件驱动的可编程网络表单,大大简化了编程。还可以用ASP.NET建立网络服务。
作者: 灵魂腐蚀    时间: 2015-1-24 15:11
微软又推出ASP.NET。这不是ASP的简单升级,而是全新一代的动态网页实现系统,用于一台WEB服务器建立强大的应用程序。是微软发展的新体系结构.NET的一部分,是ASP和.NET技术的结合。
作者: 简单生活    时间: 2015-1-26 17:22
众所周知,Windows以易用而出名,也因此占据不少的服务器市场。
作者: 若相依    时间: 2015-2-2 13:05
但是目前在CGI中使用的最为广泛的是Perl语言。所以,狭义上所指的CGI程序一般都是指Perl程序,一般CGI程序的后缀都是.pl或者.cgi。
作者: 仓酷云    时间: 2015-2-6 00:07
ASP.net的服务器,要求安装一个.net环境,当然我这里指的是windows系统,顺便点一下,.net只能放在windows环境里来运行。Asp.net1.1的就装Framework1.1,Asp.net2.0的就装Framework2.0。
作者: 透明    时间: 2015-2-8 14:32
是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错)。
作者: 金色的骷髅    时间: 2015-2-14 09:47
在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数。
作者: 愤怒的大鸟    时间: 2015-2-25 17:46
可以看作是VC和Java的混合体吧,尽管MS自己讲C#内核中更多的象VC,但实际上我还是认为它和Java更象一些吧。首先它是面向对象的编程语言,而不是一种脚本,所以它具有面向对象编程语言的一切特性。
作者: 再现理想    时间: 2015-3-8 00:26
现在主流的网站开发语言无外乎asp、php、asp.net、jsp等。
作者: 小女巫    时间: 2015-3-15 17:51
HTML:当然这是网页最基本的语言,每一个服务器语言都需要它的支持,要学习,这个肯定是开始,不说了.
作者: 若天明    时间: 2015-3-22 02:10
在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2