NET性能优化总结.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
NET性能优化总结.doc

C#.NET性能优化总结 垃圾M收解放了T?工管理对象的工作,提髙了程序的健壮性,但副作用就是程序代W可能对于对象创建变得随意, 0避免不必要的对象创建 由于垃圾回收的代价较高,所以c#程序开发要遵循的一个基本原则就是避免不必要的对象创建。以下列举一些常见的 情形。 1、 避免循坏创建对象。如果对象并不会随每次循环而改变状态,那么在循环中反复创建对象将带來性能损耗。髙效的做 法是将对象提到循环外而创建。 2、 在盂要逻辑分支中创建对象。如果对象只在某些逻辑分支中才被用到,那么应只在该逻辑分支中创建对象。 3、 使用常呈避免创建对象。程序屮不应出现如new Decimal (0)之类的代码,这会导致小对象频繁创建及回收,正 确的做法是使用Decimal. Zero常景。我们冇设汁自己的类时,也可以学习这个设计手法,应用到类似的场景屮。 4、 使川StringBuilder做字符串连接c 0不要使用空析构函数 如果类包含析构函数,由创建对象吋会在Finalize队列中添加对象的引用,以保证当对象无法可达吋,仍然可以调用 到Finalize方法。垃圾回收器在运行期间,会启动一个低优先级的线程处理该队列。相比之不,没宥析构函数的对象就 没冇这些消耗。如果析构函数为空,这个消耗就毫无意义,只会导致性能降低。因此,不要使用空的析构函数。 在实际情况中,许多曾在析构函数中包含处理代码,但后来因为种种原因被 掉或者删除掉了,只留下一个空壳,此吋应 注意把析构阐数本身 抑或删除抑。 0 实现 I disposable 接口 垃圾回收事实上只支持托管內在的回收,对于其他的非托管资源,例如Window GDI句柄或数据库连接,在析构函数屮 释放这些资源冇很大问题。原因是垃圾回收依赖于内存在紧张的情况,虽然数据庳连接可能己濒临耗以,但如果内存还很充 足的话,垃圾|?|收是不会运行的。 C#的IDisposable接口是一种显式释放资源的机制。通过提供using语句,还简化了使用方式(编译器自动生成 try... finally块,并在finally块屮调用Dispose方法)。对于中请非托管资源对象,应为实现IDisposable 接门,以保证资源一旦超出using语句范围,即得到及时释放。这对于构造健壮且性能优的程序非常冇意义。 为防止对象的Dispose力‘法不被调川的情况发生,一般还要提供析构阐数,两者调川一个处理资源释放的公共方法。同 吋,Dispose方法应调用System. GC . SuppressFinalize (this) ? G■诉垃圾M收器无需再处理Finalize方法了。 2. String 操作 0使用StringBuilder做字符串连接 String是不变类,使用+操作连接字符中将会导致创建一个新的字符中。如果字符屮连接次数不是固定的,例如在一 个循环中,则应该使用StringBuilder类來做字符申述接工作。因为StringBuilder内部有一个StringBuffer, 连接操作不会每次分配新的字符串空间。只宥当连接后的字符串超出Buffer大小时,才会中请新的Buffer空间。典型 代码如下: StringBuilder sb = new StringBuilder(256); for (int i = 0 ; i Results.Count; i++) { sb.Append (Results[i]); } 如果连接次数是固定的并且只有儿次,此吋应该直接用+号连接,保持程序简洁易读。实际上,编译器已经做了优化, 会依掘加号次数调用不同参数个数的String.Concat方法。例如:String str = strl + str2 + str3 + str4; 会被编译为String.Concat (strl, str2, str3, str4)。该方法内部会计算总的String长度,仅分配?一次,并 不会如通常想象的那样分配三次。作为一个经验值,当字符串连接操作达到10次以上时,则应该使用StringBuilder. 这里有一个细节应注意:StringBuilder内部Buffe的缺省值为16,这个值实在太小。按StringBuilder的使用 场景,Buffer肯定得嚴新分配。经验值一般用256作为Buffer的初值。当然,如果能计兑出ii终生成字符串长度的 话,则应该按这个值來设定Buffer的初值。使用new StringBuilder (256)就将Buffer的初始长度设为了 256。 0避免不必要的ToUpper或ToLower方法 String是不变类,调用Topper或ToLower方法都会导致创建一个新的字符串。如果被频繁调用,将导致频繁创建字 符串对象。这违背了前而讲到的“避免频繁创建

文档评论(0)

ggkkppp + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档