透明 发表于 2015-1-18 11:16:06

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:
<%@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在权限管理上很不灵活。

莫相离 发表于 2015-1-19 17:42:25

提供基于组件、事件驱动的可编程网络表单,大大简化了编程。还可以用ASP.NET建立网络服务。

灵魂腐蚀 发表于 2015-1-24 15:11:07

微软又推出ASP.NET。这不是ASP的简单升级,而是全新一代的动态网页实现系统,用于一台WEB服务器建立强大的应用程序。是微软发展的新体系结构.NET的一部分,是ASP和.NET技术的结合。

简单生活 发表于 2015-1-26 17:22:14

众所周知,Windows以易用而出名,也因此占据不少的服务器市场。

若相依 发表于 2015-2-2 13:05:19

但是目前在CGI中使用的最为广泛的是Perl语言。所以,狭义上所指的CGI程序一般都是指Perl程序,一般CGI程序的后缀都是.pl或者.cgi。

仓酷云 发表于 2015-2-6 00:07:38

ASP.net的服务器,要求安装一个.net环境,当然我这里指的是windows系统,顺便点一下,.net只能放在windows环境里来运行。Asp.net1.1的就装Framework1.1,Asp.net2.0的就装Framework2.0。

透明 发表于 2015-2-8 14:32:20

是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错)。

金色的骷髅 发表于 2015-2-14 09:47:13

在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数。

愤怒的大鸟 发表于 2015-2-25 17:46:49

可以看作是VC和Java的混合体吧,尽管MS自己讲C#内核中更多的象VC,但实际上我还是认为它和Java更象一些吧。首先它是面向对象的编程语言,而不是一种脚本,所以它具有面向对象编程语言的一切特性。

再现理想 发表于 2015-3-8 00:26:03

现在主流的网站开发语言无外乎asp、php、asp.net、jsp等。

小女巫 发表于 2015-3-15 17:51:56

HTML:当然这是网页最基本的语言,每一个服务器语言都需要它的支持,要学习,这个肯定是开始,不说了.

若天明 发表于 2015-3-22 02:10:37

在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数。
页: [1]
查看完整版本: ASP.NET教程之ASP.NET MVC Performance Tips(1):RenderPartial功能优化仓酷云