仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 753|回复: 11
打印 上一主题 下一主题

[学习教程] ASP.NET教程之ASP.NET MVC Performance Tips(1):RenderPartial功能优化仓酷云

[复制链接]
透明 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:16:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
在经过全球个人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>
复制代码
运转后效果以下,能够看到准确的输入了批评:

功能优化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形式在一次挪用时的功能差异以下图所示:

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

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-26 03:25

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表