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. Web前端开发人员和设计师必读文章推荐【系列十】

    <Web前端开发人员和设计师必读文章推荐系列十>给大家带来最近两个月发布在<梦想天空>的优秀文章,特别推荐给 Web 开发人员和设计师阅读.梦天空博客关注 前端开发 技术,展示 ...

  2. deeplink

    http://www.cnblogs.com/shadajin/p/5724117.html Deeplink,简单讲,就是你在手机上点击一个链接之后,可以直接链接到app内部的某个页面,而不是app ...

  3. 每日练习level-7

    1.有序列表.无序列表.自定义列表如何使用?写个简单的例子.三者在语义上有什么区别?使用场景是什么? 能否嵌套? 有序列表是一列使用数字进行标记的项目,它使用<li>包含于<ol&g ...

  4. R/Bioconductor包的下载和安装,升级

    R包:基本包(自动加载)和推荐包(安装R时也会下载,但需要手动加载),拓展包(其他包,手动加载). 安装好的包将被放在一个指定的目录下.这个目录被称为库(Library).当需要使用到某一个包的时候, ...

  5. mongodb中的__v字段

    "__v"是"versionKey"的简写,当每一个文档由mongoose创建时就会自动添加,代表这该文档的版本,此属性可配置修改,默认为"__v&q ...

  6. 重用UITableViewCell对象的概念

    重用UITableViewCell对象 UITableView控件十分常见,基本上我们随意打开一款App都能见到,它被用来列表展示数据,而其中的每一行内容都是一个cell对象 我们知道手机设备上的内存 ...

  7. Vue.js学习笔记 第一篇 数据绑定

    双花括号文本插值 先来个最简单的例子,看完之后立马会用Vue了,是不是很有成就感 <!DOCTYPE html> <html> <head> <meta ch ...

  8. 树 List Leaves 【用数组模拟了树状结构建树+搜索叶子节点+按照特殊规律输出每个叶子节点】

    Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. I ...

  9. Windows Server 2008 IIS的备份和还原

    Windows Server 2008 IIS的备份和还原 当我们服务器系统有大量的站点和虚拟目录的时候,因为种种原因需要重做系统,那么重装系统后这些站点我们是否只能一个一个的添加,如果有成百上千个站 ...

  10. linux shell执行SQL脚本

    #!/bin/sh user="user" pass="pass" sqlplus -S $user/$pass select 1 from dual; exi ...