仓酷云

标题: ASP.NET编程:C#中那些[举手之劳]的功能优化仓酷云 [打印本页]

作者: 活着的死人    时间: 2015-1-18 11:14
标题: ASP.NET编程:C#中那些[举手之劳]的功能优化仓酷云
兄弟们,想来你们都看过了昨天的比赛了。我现在的痛苦状跟当时应该差不多。希望本版.net老师不吝赐教,为小弟这一批迷途的羊羔指一条阳光之道!您也知道:学习技术如果只有一个人摸索,那是一件多么痛苦的事情!还有,如果万辛能得名师或长者指点,那又是多么一件幸福和快乐的事情!隔了好久没写工具了,次要是比来对照忙,更次要的是比来对照懒......
实在这篇很早就想写了
事情和生存中常常能够看到一些程序猿,写代码的时分只存眷代码的逻辑性,而不思索运转效力
实在这对年夜多半程序猿来讲都是没有成绩的
不外作为一只要幻想的CodeMonkey,我仍是但愿给人人分享一些功能优化心得
已经在网上听过如许一句话
程序的可读性和功能是成正比的
我十分赞成这句话,以是关于那些极端影响浏览的功能优化我就不在这里赘述了
明天次要说的就是一些举手之劳便可完成的功能优化
削减反复代码

这是最基础的优化计划,尽量削减那些反复做的事,让他们只做一次
对照罕见是这类代码,一样的Math.Cos(angle)和Math.Sin(angle)都做了2次
ASP.NET编程:C#中那些[举手之劳]的功能优化仓酷云
登录/注册后可看大图
  1. privatePointRotatePt(doubleangle,Pointpt){PointpRet=newPoint();angle=-angle;pRet.X=(int)((double)pt.X*Math.Cos(angle)-(double)pt.Y*Math.Sin(angle));pRet.Y=(int)((double)pt.X*Math.Sin(angle)+(double)pt.Y*Math.Cos(angle));returnpRet;}
复制代码

优化后
  1. privatePointRotatePt3(doubleangle,Pointpt){PointpRet=newPoint();angle=-angle;doubleSIN_ANGLE=Math.Sin(angle);doubleCOS_ANGLE=Math.Cos(angle);pRet.X=(int)(pt.X*COS_ANGLE-pt.Y*SIN_ANGLE);pRet.Y=(int)(pt.X*SIN_ANGLE+pt.Y*COS_ANGLE);returnpRet;}
复制代码

另有另外一种,在办法中实例化一个对象,可是这个对象实际上是能够复用的
  1. publicstaticstringConvertQuot(stringhtml){Regexregex=newRegex("&(quot|#34);",RegexOptions.IgnoreCase);returnregex.Replace(html,""");}
复制代码
优化后
  1. readonlystaticRegexReplaceQuot=newRegex("&(quot|#34);",RegexOptions.IgnoreCase|RegexOptions.Compiled);publicstaticstringConvertQuot(stringhtml){returnReplaceQuot.Replace(html,""");}
复制代码
另有一种是不用要的初始化,好比挪用out参数之前,是不必要初始化的
  1. publicboolCheck(intuserid){varuser=newUser();if(GetUser(userid,outuser)){returnuser.Level>1;}returnfalse;}
复制代码

这里的newUser()就是不用要的操纵,
优化后
  1. publicboolCheck(intuserid){Useruser;if(GetUser(userid,outuser)){returnuser.Level>1;}returnfalse;}
复制代码

不要科学正则表达式

恰好在第一个栗子里说到了正在表达式(Regex)对象就特地一同说了
良多人觉得正则表达式很快,十分快,超等的快
固然正则表达式是挺快的,不外万万不要科学他,不信你看上面的栗子
  1. //办法1publicstaticstringConvertQuot1(stringhtml){returnhtml.Replace(""",""").Replace(""",""");}readonlystaticRegexReplaceQuot=newRegex("&(quot|#34);",RegexOptions.IgnoreCase|RegexOptions.Compiled);//办法2publicstaticstringConvertQuot2(stringhtml){returnReplaceQuot.Replace(html,""");}
复制代码

有几人以为正则表达式对照快的,举个手??
ASP.NET编程:C#中那些[举手之劳]的功能优化仓酷云
登录/注册后可看大图

了局为10w次轮回的工夫,即便是10个Replace连用,也比Regex好,以是不要科学他
  1. //办法1publicstaticstringConvertQuot1(stringhtml){returnhtml.Replace("0","").Replace("1","").Replace("2","").Replace("3","").Replace("4","").Replace("5","").Replace("6","").Replace("7","").Replace("8","").Replace("9","");}readonlystaticRegexReplaceQuot=newRegex("[1234567890]",RegexOptions.IgnoreCase|RegexOptions.Compiled);//办法2publicstaticstringConvertQuot2(stringhtml){returnReplaceQuot.Replace(html,"");}
复制代码

ConvertQuot1:3518
ConvertQuot2:12479
最初给你们看一个实在的,杯具的栗子
ASP.NET编程:C#中那些[举手之劳]的功能优化仓酷云
登录/注册后可看大图
ViewCode
公道利用正则表达式

下面说了正则表达式的效力不高,并非说就不要用他了,最少正则表达式的感化不单单云云罢了
假如必定要用正则表达式的话也必要注重,能静态全局公用的只管全局公用
  1. readonlystaticRegexregex=newRegex("[1234567890]",RegexOptions.Compiled);
复制代码
注重他的第二个参数RegexOptions.Compiled正文是指定将正则表达式编译为程序集。这会发生更快的实行速率,但会增添启动工夫。
普通的说就是加了这个列举,会使得初始化Regex对象变慢,可是实行字符串查找的时分更快,不利用的话,初始化良多,查询对照慢
之前测过相差蛮年夜的,代码就不对照了,有乐趣的能够本人尝尝相差几
别的另有一些列举项,不断定是不是对功能有影响,不外仍是按划定规矩利用会对照好

让编译器预处置常量的盘算

编译器在编译程序段的时分假如发明有一些运算是常量对常量的,那末他会在编译时代就盘算完成,如许可使程序在实行时不必反复盘算了
好比
ASP.NET编程:C#中那些[举手之劳]的功能优化仓酷云
登录/注册后可看大图

不外编译器有的时分也不是那末伶俐的
ASP.NET编程:C#中那些[举手之劳]的功能优化仓酷云
登录/注册后可看大图

这个时分就必要我们匡助一下了
ASP.NET编程:C#中那些[举手之劳]的功能优化仓酷云
登录/注册后可看大图

给他加一个括号,让他晓得应当先盘算常量,如许就能够在编译时代举行运算了
字符串对照

这个大概良多人晓得了,但仍是提一下
  1. strings="";1)if(s==""){}2)if(s==string.Empty){}3)if(string.IsNullOrEmpty(s)){}4)if(s!=null&&s.Length==0){}5)if((s+"").Length==0){}
复制代码

1,2最慢3较快4,5最快
1,2几近没区分4,5几近没区分
不外这个只合用于对照null和空字符串,假如是一连的空缺就是string.IsNullOrWhiteSpace最快了,不外这个办法2.0内里没有
以是2.0能够如许(s+"").trim()==0
这里的关头就是s+""这个操纵能够把null转换为""
注重第二个参数只能是""或string.Empty如许的累加几近是不用耗工夫的,假如第二个参数是""(一个空格)这个工夫就远远不止了
字符串拼接

字符串累加,这个事理和Regex一样,不要自觉崇敬StringBuilder
在大批(或不断定的)string拼接的时分,StringBuilder的确能够起到提速的感化
而多数几个流动的string累加的时分就不必要StringBuilder了,究竟StringBuilder的初始化也是必要工夫的
感激#5楼2014-03-2416:45残蛹博友供应的申明
ps:这段我的确记得我是写过的来着,不晓得怎样的,收回来的时分就不见了.....
ASP.NET编程:C#中那些[举手之劳]的功能优化仓酷云
登录/注册后可看大图

别的另有一个string.Concat办法,该办法能够小幅度的优化程序的速率,幅度很小
他和string.Join的区分在于没有距离标记(我之前经常使用string.Join("",a,b,c,d),不要告知我只要我一团体这么干)
另外一种常常碰到的字符串拼接
  1. privatePointRotatePt3(doubleangle,Pointpt){PointpRet=newPoint();angle=-angle;doubleSIN_ANGLE=Math.Sin(angle);doubleCOS_ANGLE=Math.Cos(angle);pRet.X=(int)(pt.X*COS_ANGLE-pt.Y*SIN_ANGLE);pRet.Y=(int)(pt.X*SIN_ANGLE+pt.Y*COS_ANGLE);returnpRet;}0
复制代码

关于这类情形有2中优化的计划
关于3.5以上能够间接利用Linq帮助,这类计划代码少,可是功能绝对差一些
  1. privatePointRotatePt3(doubleangle,Pointpt){PointpRet=newPoint();angle=-angle;doubleSIN_ANGLE=Math.Sin(angle);doubleCOS_ANGLE=Math.Cos(angle);pRet.X=(int)(pt.X*COS_ANGLE-pt.Y*SIN_ANGLE);pRet.Y=(int)(pt.X*SIN_ANGLE+pt.Y*COS_ANGLE);returnpRet;}1
复制代码
关于非3.5或对功能请求极高的场所
  1. privatePointRotatePt3(doubleangle,Pointpt){PointpRet=newPoint();angle=-angle;doubleSIN_ANGLE=Math.Sin(angle);doubleCOS_ANGLE=Math.Cos(angle);pRet.X=(int)(pt.X*COS_ANGLE-pt.Y*SIN_ANGLE);pRet.Y=(int)(pt.X*SIN_ANGLE+pt.Y*COS_ANGLE);returnpRet;}2
复制代码

bool范例的判别前往

这类征象罕见于老手程序员中
  1. privatePointRotatePt3(doubleangle,Pointpt){PointpRet=newPoint();angle=-angle;doubleSIN_ANGLE=Math.Sin(angle);doubleCOS_ANGLE=Math.Cos(angle);pRet.X=(int)(pt.X*COS_ANGLE-pt.Y*SIN_ANGLE);pRet.Y=(int)(pt.X*SIN_ANGLE+pt.Y*COS_ANGLE);returnpRet;}3
复制代码

范例的判别

一样平常范例的判别有2种情势
1,这类属于代码对照好写,可是功能对照低,缘故原由就是GetType()的时分损耗了良多工夫
  1. privatePointRotatePt3(doubleangle,Pointpt){PointpRet=newPoint();angle=-angle;doubleSIN_ANGLE=Math.Sin(angle);doubleCOS_ANGLE=Math.Cos(angle);pRet.X=(int)(pt.X*COS_ANGLE-pt.Y*SIN_ANGLE);pRet.Y=(int)(pt.X*SIN_ANGLE+pt.Y*COS_ANGLE);returnpRet;}4
复制代码

2,这类属性写代码贫苦,可是功能很高的范例
  1. privatePointRotatePt3(doubleangle,Pointpt){PointpRet=newPoint();angle=-angle;doubleSIN_ANGLE=Math.Sin(angle);doubleCOS_ANGLE=Math.Cos(angle);pRet.X=(int)(pt.X*COS_ANGLE-pt.Y*SIN_ANGLE);pRet.Y=(int)(pt.X*SIN_ANGLE+pt.Y*COS_ANGLE);returnpRet;}5
复制代码

实在有其中间之道,既能够包管功能又能够对照好写
  1. privatePointRotatePt3(doubleangle,Pointpt){PointpRet=newPoint();angle=-angle;doubleSIN_ANGLE=Math.Sin(angle);doubleCOS_ANGLE=Math.Cos(angle);pRet.X=(int)(pt.X*COS_ANGLE-pt.Y*SIN_ANGLE);pRet.Y=(int)(pt.X*SIN_ANGLE+pt.Y*COS_ANGLE);returnpRet;}6
复制代码

年夜部分情形下这个是能够用的假如你本人有个范例完成了IConvertible,然后前往TypeCode.Int32就不再这个会商局限以内了
利用列举作为索引

上面这个是一个实在的例子,为了凸起重点,做了部分修正,删除过剩的分支,源代码中不但4个
  1. privatePointRotatePt3(doubleangle,Pointpt){PointpRet=newPoint();angle=-angle;doubleSIN_ANGLE=Math.Sin(angle);doubleCOS_ANGLE=Math.Cos(angle);pRet.X=(int)(pt.X*COS_ANGLE-pt.Y*SIN_ANGLE);pRet.Y=(int)(pt.X*SIN_ANGLE+pt.Y*COS_ANGLE);returnpRet;}7
复制代码

优化后
  1. privatePointRotatePt3(doubleangle,Pointpt){PointpRet=newPoint();angle=-angle;doubleSIN_ANGLE=Math.Sin(angle);doubleCOS_ANGLE=Math.Cos(angle);pRet.X=(int)(pt.X*COS_ANGLE-pt.Y*SIN_ANGLE);pRet.Y=(int)(pt.X*SIN_ANGLE+pt.Y*COS_ANGLE);returnpRet;}8
复制代码

不外有的时分,列举纷歧建都是一连的数字,那末也能够利用Dictionary
  1. privatePointRotatePt3(doubleangle,Pointpt){PointpRet=newPoint();angle=-angle;doubleSIN_ANGLE=Math.Sin(angle);doubleCOS_ANGLE=Math.Cos(angle);pRet.X=(int)(pt.X*COS_ANGLE-pt.Y*SIN_ANGLE);pRet.Y=(int)(pt.X*SIN_ANGLE+pt.Y*COS_ANGLE);returnpRet;}9
复制代码

这类优化在分支对照多的时分很好用,少的时分感化无限
字符范例Char,分支判别时的处置技能

这部份内容对照庞大,并且合用局限无限,假如平常用不到的就能够疏忽了
在处置字符串对象的时分,偶然会必要判别char的值然后做进一步的操纵

归根到底,net网页编程跨平台可以,但是要重新编写代码,否则还分什么J2EE/J2SE/J2ME呢!
作者: 冷月葬花魂    时间: 2015-1-20 18:19
通过这次激烈的讨论,我从大家身上学到了太多,开阔了眼界,不管是支持我的还是骂我的,都感谢你们。
作者: 只想知道    时间: 2015-1-29 14:10
使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行,用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。
作者: 飘灵儿    时间: 2015-1-29 14:10
能产生和执行动态、交互式、高效率的站占服务器的应用程序。运用ASP可将VBscript、javascript等脚本语言嵌入到HTML中,便可快速完成网站的应用程序,无需编译,可在服务器端直接执行。容易编写。
作者: 简单生活    时间: 2015-2-6 01:46
主流网站开发语言之ASP:ASP是微软(Microsoft)所开发的一种后台脚本语言,它的语法和VisualBASIC类似,可以像SSI(ServerSideInclude)那样把后台脚本代码内嵌到HTML页面中。虽然ASP简单易用,但是它自身存在着许多缺陷,最重要的就是安全性问题。
作者: 若相依    时间: 2015-2-14 21:06
逐步缩小出错代码段的范围,最终确定错误代码的位置。
作者: 精灵巫婆    时间: 2015-3-4 10:30
虽然在形式上JSP和ASP或PHP看上去很相似——都可以被内嵌在HTML代码中。但是,它的执行方式和ASP或PHP完全不同。在JSP被执行的时候,JSP文件被JSP解释器(JSPParser)转换成Servlet代码,然后Servlet代码被Java编译器编译成.class字节文件,这样就由生成的Servlet来对客户端应答。所以,JSP可以看做是Servlet的脚本语言(ScriptLanguage)版。
作者: 第二个灵魂    时间: 2015-3-5 23:34
主流网站开发语言之JSP:JSP和Servlet要放在一起讲,是因为它们都是Sun公司的J2EE(Java2platformEnterpriseEdition)应用体系中的一部分。
作者: 兰色精灵    时间: 2015-3-9 21:07
JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。
作者: 山那边是海    时间: 2015-3-11 17:39
主流网站开发语言之ASP:ASP是微软(Microsoft)所开发的一种后台脚本语言,它的语法和VisualBASIC类似,可以像SSI(ServerSideInclude)那样把后台脚本代码内嵌到HTML页面中。虽然ASP简单易用,但是它自身存在着许多缺陷,最重要的就是安全性问题。
作者: 柔情似水    时间: 2015-3-12 21:25
网页从开始简单的hmtl到复杂的服务语言,走过了10多个年头,各种技术层出不穷,单个的主流技术也在不断翻新的版本,现在分析下各种语言的区别、优势、劣势、开发注意事项!
作者: 再现理想    时间: 2015-3-20 02:47
代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。




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