- 1、本文档共17页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[C#性能优化总结
C#.NET性能优化总结
Revision History
Date Revision Description Author Approved by 2009.2.6 起草 尤西锋
目 录
1. 垃圾回收 2
? 避免不必要的对象创建 3
? 不要使用空析构函数 3
? 实现Idisposable接口 3
2. String操作 4
? 使用StringBuilder做字符串连接 4
? 避免不必要的ToUpper或ToLower方法 5
? 最快的空串比较方法 5
3. 类型系统 6
? 避免无意义的变量初始化 6
? ValueType和ReferenceType 6
? 尽可能使用最合适的类型 8
4. 异常处理 8
? 不要吃掉异常 8
? 不要吃掉异常信息 8
? 避免不必要的抛出异常 8
? 避免不必要的重新抛出异常 9
? 捕获指定的异常不要使用通用的System.Exception 9
? 要在finally里释放占用的资源 10
5. 反射 10
? 反射分类 10
? 动态创建对象 11
? 动态方法调用 11
? 推荐的使用原则 11
6. 基本代码技巧 12
? 循环写法 12
? 拼装字符串 12
? 避免两次检索集合元素 13
? 避免两次类型转换 14
? 为字符串容器声明常量 14
? 使用StringBuilder 15
? 避免在循环体里声明变量 15
7. Hashtable 16
? Hashtable机制 16
? 使用HashTale代替其他字典集合类型的情形 17
8. 避免使用ArrayList 17
9. 从XML对象读取数据 18
垃圾回收
垃圾回收解放了手工管理对象的工作,提高了程序的健壮性,但副作用就是程序代码可能对于对象创建变得随意。
避免不必要的对象创建
由于垃圾回收的代价较高,所以C#程序开发要遵循的一个基本原则就是避免不必要的对象创建。以下列举一些常见的情形。
避免循环创建对象。如果对象并不会随每次循环而改变状态,那么在循环中反复创建对象将带来性能损耗。高效的做法是将对象提到循环外面创建。
在需要逻辑分支中创建对象。如果对象只在某些逻辑分支中才被用到,那么应只在该逻辑分支中创建对象。
使用常量避免创建对象。程序中不应出现如 new Decimal(0) 之类的代码,这会导致小对象频繁创建及回收,正确的做法是使用Decimal.Zero常量。我们有设计自己的类时,也可以学习这个设计手法,应用到类似的场景中。
使用StringBuilder做字符串连接。
不要使用空析构函数
如果类包含析构函数,由创建对象时会在 Finalize 队列中添加对象的引用,以保证当对象无法可达时,仍然可以调用到 Finalize 方法。垃圾回收器在运行期间,会启动一个低优先级的线程处理该队列。相比之下,没有析构函数的对象就没有这些消耗。如果析构函数为空,这个消耗就毫无意义,只会导致性能降低。因此,不要使用空的析构函数。
在实际情况中,许多曾在析构函数中包含处理代码,但后来因为种种原因被注释掉或者删除掉了,只留下一个空壳,此时应注意把析构函数本身注释掉或删除掉。
实现Idisposable接口
垃圾回收事实上只支持托管内在的回收,对于其他的非托管资源,例如 Window GDI 句柄或数据库连接,在析构函数中释放这些资源有很大问题。原因是垃圾回收依赖于内存在紧张的情况,虽然数据库连接可能已濒临耗尽,但如果内存还很充足的话,垃圾回收是不会运行的。
C#的 IDisposable 接口是一种显式释放资源的机制。通过提供 using 语句,还简化了使用方式(编译器自动生成 try ... finally 块,并在 finally 块中调用 Dispose 方法)。对于申请非托管资源对象,应为其实现 IDisposable 接口,以保证资源一旦超出 using 语句范围,即得到及时释放。这对于构造健壮且性能优良的程序非常有意义。
为防止对象的 Dispose 方法不被调用的情况发生,一般还要提供析构函数,两者调用一个处理资源释放的公共方法。同时,Dispose 方法应调用 System.GC.SuppressFinalize(this),告诉垃圾回收器无需再处理 Finalize 方法了。
String操作
使用StringBuilder做字符串连接
String 是不变类,使用 + 操作连接字符串将会导致创建一个新的字符串。如果字符串连接次数不是固定的,例如在一个循环中,则应该使用 StringBuilder 类来做字符串连接工作。因为 StringBuilder 内部有一个 StringBuffer ,连接操作不会每次分配新的字符串空间。只有当连接后的字符串超出 B
您可能关注的文档
- [类比论证和比喻论证的区别和联系.ppt
- [Authorware下拉菜单与多级菜单的制作.doc
- [AST中央企业班组长岗位管理能力资格认证三期模拟1030-06.doc
- [AutoCAD快捷命令的使用.doc
- [AutoCAD打开速度慢的解决办法高人指点.doc
- [Authorware软件简介.doc
- [AviraAntiVir.doc
- [AUTOCAD技术在勘测定界中的应用.doc
- [英语四级图表作文作业.ppt
- [AutodeskMax9.0简体中文版安装.doc
- 2022-2023学年福建省莆田二十五中八年级(下)期末数学试卷(含解析).pdf
- 2019年苏教版下册二年级语文补充习题答案 (I) .pdf
- 2022年上海市黄浦区第十中学中考三模物理试题(含答案解析) .pdf
- 2020年广西南宁三中初中部大学区中考数学三模试卷(附答案详解) .pdf
- 2019版必修中外历史纲要上册第25课人民解放战争导学案(无答案.pdf
- 2021年(初级)银行从业资格模拟试题6篇 .pdf
- 2022初级银行从业资格之初级银行业法律法规与综合能力高分题库附精品.pdf
- 2022年威海职业学院单招语文模拟试题(附答案解析) .pdf
- 2021年湘教版九年级化学(上册)月考月考试卷(附答案) .pdf
- 2022-2023学年广西南宁二中学数学八年级第一学期期末学业质量监测模拟试 .pdf
最近下载
- 五四制初中一年级中华优秀传统文化教学设计.pptx VIP
- 《微生物与健康》课件科学六年级上册.pptx
- 七年级上册生物学《生物体的结构层次》单元作业设计.docx
- 电子信息工程职业规划 (第二版).pptx VIP
- 党的二十届三中全会精神测试题300道(单选、多选、判断、填空).docx VIP
- 部编教材年级识字课教学.ppt VIP
- 贵州省贵阳市2024-2025学年高一上学期10月联合考试(一) 数学 PDF版含解析.pdf
- 基于Android的个人生活行为记录及习惯养成平台的设计与实现-毕业设计.doc
- 中国传媒大学-节目主持艺术基础(第二版)-课件.pptx
- 纤维增强复合材料在建筑工程结构加固中的应用(经济论文资料).doc
文档评论(0)