C#程序性能优化
http://blog.csdn.net/scalzdp/article/details/34421639
程序中我们每一丝动作都会加大程序运行的负担,当刚开始学习程序的时候常常不会去考虑程序运行的效率,大多数情况是为了实现功能,只要功能达到我想要的那么就算是达成了此项目标。当大部分功能的编码实现对我们来说都不是大的问题的时候,我们要提升就要考虑怎样把程序写的更加规范更加高效。怎样写的高效,我们不说整体架构的设计,仅仅分享一下C#自身程序中的一些会影响性能的点。
1.垃圾回收
.NET Framework垃圾回收的成本高,每次回收垃圾的时候调用最久未被使用的算法,找出最久未被使用的对象然后把这个对象分配的内存进行回收。进行这样的算法会非常消耗计算机的运算能力,所以在C#程序编码中避免创建不必要的对象。
1.1避免在循环中创建对象
高效的做法是将对象的创建置于循环之外。但是如果每一次循环需要实例化一个对象加入到对象列表中这个就避免不了在循环内部创建对象,如果把这个对象创建在对象之外那么会导致循环多次加入到列表中的对象是循环最后一次对象的数据了。
1.2在需要的地方才创建对象
如果对象只有在某些分支逻辑中才会被使用到,那么把具体创建对象的操作放在逻辑分支中。尽量避免在函数之前创建出函数所要使用到的所有对象。
2.String操作
String字符串操作,我们多次使用到的。所以在操作String的时候采用不高效的处理会一定程度上影响到程序的执行效率。
2.1. 我们认识一下String
String是不变类,如果我们使用“+”来连接字符串,会导致创建一个新的空间来存储连接后的字符串,在多次循环中使用“+”会导致内存循环被开辟。这个时候应该使用StringBuilder。StringBuilder内部有一个StringBuffer,连接操作不会每一次都分配新的字符串空间。
- <span style="font-family:FangSong_GB2312;">StringBuilder sb = new StringBuilder(256 );
- for ( int i = 0 ; i < Results.Count; i ++ )
- {
- sb.Append (Results[i]);
- }</span>
2.2.字符串String对象的Length与0比较最快的,其次是String.Empty或空串
C#在编译时将程序集中声明的所有字符串常量放到保留池中(intern pool),相同常量就不会重复分配了。
3.线程同步
3.1.线程同步粒度
C#线程同步通过Lock锁定对象,我们可以锁定一个方法,也可以锁定方法中的某一段代码。
通常情况下,应该减小同步的范围,使系统获得更好的性能。
3.2.同步策略
使用lock锁定对象应该注意一下两点
第一、避免使用锁定Type,锁定Type对象会影响进程中所有该锁定对象都不能被他人使用,可能会导致无厘头的错误,他的锁定范围太大了。
第二、避免使用锁定this,程序中this表示当前对象,锁定了改对象实例会影响其他使用到该示例的方法。
第三、建议,如果要同步,找到需要锁定的最小范围,然后实例化一个object对象,该对象只为了实现同步的目的。
4.CLR,C#的中间语言
CLR是C#语言被编译之后的程序集,他是微软设计的一款中间语言。
4.1.ValueType和ReferenceType
value类型是从栈上面分配的,引用类型是从堆上面分配的。当值类型作为方法参数时,默认会进行参数值赋值。所以使用引用类型传递数据要比值类型传递数据效率高。
4.2.避免装箱和拆箱
简单来说装箱就是把值类型转化为引用类型,拆箱就是把引用类型转化为值类型。
5.异常处理
5.1 程序中该抛出异常的地方一定要跑出异常,使用try....catch...模块包裹,这与性能无关,但是与程序排错非常必要。
5.2 程序在抛出异常和捕获异常会消耗比较大的操作,在程序编写的情况下,通过完善程序逻辑尽量避免抛出不
6.反射的使用
他是将编译期间的静态绑定延迟到运行期间的动态绑定。反射带来了很多设计的灵活性,但是与静态绑定相比,动态绑定对性能有较大的影响。
1. Type.InvokeMember
2. ContructorInfo.Invoke
3. Activator.CreateInstance(Type)
4. Activator.CreateInstance(assemblyName, typeName)
5. Assembly.CreateInstance(typeName)
性能最快的是3,最慢的是4
建议:
1.如果可能,避免使用反射和动态绑定。
2.使用接口调用方式,将动态绑定改造为早期绑定
3.Activator.CreateInstance(Type)方式动态创建对象
4.使用typeof操作符替代GetType调用。
7.普遍规律
推荐使用as
8.性能优化策略
8.1.现在的存储设备越来越便宜,所以,实践中大部分的优化工作都是想方设法用空间换时间。
8.2.性能瓶颈诊断:使用专业的工具进行代码性能的诊断,或者使用C#的StopWatch统计处程序代码执行的时间消耗。
8.3.性能优化实践,性能优化方法主要有:优化系统结构、使用缓存、延后执行、优化算法和异步/多线程编程
C#程序性能优化的更多相关文章
- C++ 应用程序性能优化
C++ 应用程序性能优化 eryar@163.com 1. Introduction 对于几何造型内核OpenCASCADE,由于会涉及到大量的数值算法,如矩阵相关计算,微积分,Newton迭代法解方 ...
- Java程序性能优化技巧
Java程序性能优化技巧 多线程.集合.网络编程.内存优化.缓冲..spring.设计模式.软件工程.编程思想 1.生成对象时,合理分配空间和大小new ArrayList(100); 2.优化for ...
- 《Java程序性能优化:让你的Java程序更快、更稳定》
Java程序性能优化:让你的Java程序更快.更稳定, 卓越网更便宜,不错的书吧
- [JAVA] java程序性能优化
一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子: import java.util ...
- iOS程序性能优化
iOS程序性能优化 一.初级 使用ARC进行内存管理 在iOS5发布的ARC,它解决了最常见的内存泄露问题.但是值得注意的是,ARC并不能避免所有的内存泄露.使用ARC之后,工程中可能还会有内存泄露, ...
- [python]用profile协助程序性能优化
转自:http://blog.csdn.net/gzlaiyonghao/article/details/1483728 本文最初发表于恋花蝶的博客http://blog.csdn.net/lanph ...
- iOS 程序性能优化
前言 转载自:http://www.samirchen.com/ios-performance-optimization/ 程序性能优化不应该是一件放在功能完成之后的事,对性能的概念应该从我们一开始写 ...
- 微信小程序性能优化技巧
摘要: 如果小程序不够快,还要它干嘛? 原文:微信小程序性能优化方案--让你的小程序如此丝滑 作者:杜俊成要好好学习 Fundebug经授权转载,版权归原作者所有. 微信小程序如果想要优化性能,有关键 ...
- [转]C#程序性能优化
C#程序性能优化 1.显式注册的EvenHandler要显式注销以避免内存泄漏 将一个成员方法注册到某个对象的事件会造成后者持有前者的引用.在事件注销之前,前者不会被垃圾回收. private v ...
- [深入浅出Cocoa]iOS程序性能优化
本文转载至 http://blog.csdn.net/kesalin/article/details/8762032 [深入浅出Cocoa]iOS程序性能优化 罗朝辉 (http://blog.csd ...
随机推荐
- javascript;Dom相关笔记
document.ondblclick 页面双击事件document.title.charAt(0) 取标题第1个字符串window.alert 弹出消息对话框window.confirm 显示确定 ...
- FTP下载
import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import ja ...
- flex datagrid 导出csv
public function exportToCSV(dataGrid:DataGrid):void { var dataProviderCollection:ArrayCollection = d ...
- Android系统源代码的下载与编译
http://www.jianshu.com/p/aeaceda41798 目录 1.简介 2.官方同步源代码 3.镜像同步源代码 4.已有源代码更新 5.编译源代码 5.1编译Android 4.1 ...
- android 加固防止反编译-重新打包
http://blog.csdn.net/u010921385/article/details/52505094 1.需要加密的Apk(源Apk) 2.壳程序Apk(负责解密Apk工作) 3.加密工具 ...
- CentOS 5下freeswitch中集成使用ekho实现TTS功能二
三:以上Festival安装完成以后回到ekho安装目录: 执行./configure --enable-festival 前 更改configure 1:替换 #AC_DEFINE(ENABLE_F ...
- 80211N、80211AC建链速率值(对应MCS)
转:http://www.docin.com/p-1713976102.html?docfrom=rrela 注:各种技术对速率提升的贡献各项技术对提高传输速率的贡献如下:子载波数目增加: 802.1 ...
- linux下查找文件或目录(which,whereis,locate,find)
命令 查找对象 查找速度 备注 which 可执行文件 根据PATH变量的内容去寻找可执行文件 不同的PATH配置会有不一样的结果 whereis 程序名的搜索 根据数据库来寻找,速度快 ...
- Java中Arrays.sort()和Collections.sort()
1.简单示例 sort方法的使用非常的简单明了,下面的例子中,先定义一个比较Dog大小的Comparator,然后将其实例对象作为参数传给sort方法,通过此示例,你应该能够快速掌握Arrays.so ...
- Qt编译器
有两种,MSVC和MINGW Qt 中有两种方式编译,一种是MinGW ,另一种MSVC. MSVC是指微软的VC编译器: MingGW是指是Minimalist GNU on Windows的缩写. ...