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,连接操作不会每一次都分配新的字符串空间。

  1. <span style="font-family:FangSong_GB2312;">StringBuilder sb = new StringBuilder(256 );
  2. for ( int i = 0 ; i < Results.Count; i ++ )
  3. {
  4. sb.Append (Results[i]);
  5. }</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#程序性能优化的更多相关文章

  1. C++ 应用程序性能优化

    C++ 应用程序性能优化 eryar@163.com 1. Introduction 对于几何造型内核OpenCASCADE,由于会涉及到大量的数值算法,如矩阵相关计算,微积分,Newton迭代法解方 ...

  2. Java程序性能优化技巧

    Java程序性能优化技巧 多线程.集合.网络编程.内存优化.缓冲..spring.设计模式.软件工程.编程思想 1.生成对象时,合理分配空间和大小new ArrayList(100); 2.优化for ...

  3. 《Java程序性能优化:让你的Java程序更快、更稳定》

    Java程序性能优化:让你的Java程序更快.更稳定, 卓越网更便宜,不错的书吧

  4. [JAVA] java程序性能优化

    一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子: import java.util ...

  5. iOS程序性能优化

    iOS程序性能优化 一.初级 使用ARC进行内存管理 在iOS5发布的ARC,它解决了最常见的内存泄露问题.但是值得注意的是,ARC并不能避免所有的内存泄露.使用ARC之后,工程中可能还会有内存泄露, ...

  6. [python]用profile协助程序性能优化

    转自:http://blog.csdn.net/gzlaiyonghao/article/details/1483728 本文最初发表于恋花蝶的博客http://blog.csdn.net/lanph ...

  7. iOS 程序性能优化

    前言 转载自:http://www.samirchen.com/ios-performance-optimization/ 程序性能优化不应该是一件放在功能完成之后的事,对性能的概念应该从我们一开始写 ...

  8. 微信小程序性能优化技巧

    摘要: 如果小程序不够快,还要它干嘛? 原文:微信小程序性能优化方案--让你的小程序如此丝滑 作者:杜俊成要好好学习 Fundebug经授权转载,版权归原作者所有. 微信小程序如果想要优化性能,有关键 ...

  9. [转]C#程序性能优化

    C#程序性能优化 1.显式注册的EvenHandler要显式注销以避免内存泄漏 将一个成员方法注册到某个对象的事件会造成后者持有前者的引用.在事件注销之前,前者不会被垃圾回收.   private v ...

  10. [深入浅出Cocoa]iOS程序性能优化

    本文转载至 http://blog.csdn.net/kesalin/article/details/8762032 [深入浅出Cocoa]iOS程序性能优化 罗朝辉 (http://blog.csd ...

随机推荐

  1. Apache Kudu

    Apache Kudu是由Cloudera开源的存储引擎,可以同时提供低延迟的随机读写和高效的数据分析能力.Kudu支持水平扩展,使用Raft协议进行一致性保证,并且与Cloudera Impala和 ...

  2. mysql库安装

    如果缺少<mysql/mysql.h> 先安装mysql,然后apt-get install libmysqlclient-dev即可

  3. OpenGL学习进程(8)第六课:点、边和图形(三)绘制图形

    本节是OpenGL学习的第六个课时,下面介绍OpenGL图形的相关知识:     (1)多边形的概念: 多边形是由多条线段首尾相连而形成的闭合区域.OpenGL规定,一个多边形必须是一个“凸多边形”. ...

  4. 优化MD5和IP在(MySQL)数据库中的存储

    1.MD5在MySQL数据库中的存储 用CHAR(32)来存储MD5值是一个常见的技巧.如果你的应用程序使用VARCHAR(32),则对每个值得字符串长度都需要花费额外的不 必要的开销.这个十六进制的 ...

  5. 【Tech】POI标签分类

    寒假老板给的任务,让我重现这个实验http://www.liuhaihua.cn/archives/15565.html.自己就随便试了下,用的都是比较经典(lao)的算法和知识,记录一下. 一.从网 ...

  6. python的常用的内置函数

    使用内置函数的好处:简单,快速. 1.zip():以多个序列为参数,返回元祖列表. 长度:在多个序列长度不一时,以最短的为准. 常见用途:构建多参数列表,构建字典. 2.map():在python2旧 ...

  7. python的语法错误总结

    1.keyerror一般是你使用字典里不存在的key产生的错误. 2.TypeError一般是使用的数据类型不符合要求 join函数要求a都是string

  8. 第四篇、linux系统文件属性三

    一.linux文件属性之文件权限体系介绍 二.linux中连接介绍 三.软连接 四.图解 五文件删除原理 主要内容

  9. ARC管理内存(一)

    相关概念 栈 当程序执行某个方法(或函数)时,会从内存中名为栈(stack)的区域分配一块内存空间,这块内存空间称为帧(frame).帧负责保存程序在方法内声明的变量的值.在方法内声明的变量称为局部变 ...

  10. USB引脚及定义

    USB 2.0 USB接口定义: USB引脚定义: 针脚 名称 说明 接线颜色 1 VCC +5V电压 红色 2 D- 数据线负极 白色 3 D+ 数据线正极 绿色 4 GND 接地 黑色   Min ...