C#程序性能优化

程序中我们每一丝动作都会加大程序运行的负担,当刚开始学习程序的时候常常不会去考虑程序运行的效率,大多数情况是为了实现功能,只要功能达到我想要的那么就算是达成了此项目标。当大部分功能的编码实现对我们来说都不是大的问题的时候,我们要提升就要考虑怎样把程序写的更加规范更加高效。怎样写的高效,我们不说整体架构的设计,仅仅分享一下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#程序性能优化

时间: 2024-10-27 12:06:52

C#程序性能优化的相关文章

Java程序性能优化——性能调优层次

为了提升系统性能,开发人员可以从系统的各个角度和层次对系统进行优化.除了最常见的代码优化外,在软件架构上.JVM虚拟机层.数据库以及操作系统层都可以通过各种手段进行调优,从而在整体上提升系统的性能. 设计调优 设计调优处于所有调优手段的上层,它往往需要在软件开发之前进行.在软件开发之初,软件架构师就应该评估系统可能存在的各种潜在的问题,并给出合理的设计方案.由于软件设计和架构对软件整体有决定性的影响,所以,设计调优对系统性能的影响也是最大的.如果说,代码优化.JVM优化都是对系统微观层面上"量&

程序性能优化之SQL篇

如果说功能是程序的躯体,那么性能就是程序的灵魂.完整的功能可以保证程序的躯体是健全的,而良好的性能才是程序灵魂的象征,本文就程序的性能优化做简单的介绍. 最近对程序的性能的体会尤为深刻.最近做了一个数据查询和显示的功能,从7张表大概1500条数据中查询25条数据并且显示出来,时间消耗1秒钟.我的计算机参数为:CPU:i5处理器,4G内存.这个执行速度相当的慢,好在我查询的数据量比较小,等待时间不是很多,但是程序性能优化确实刻不容缓. 仔细分析了程序,发现有很多地方都是需要修改的,我们先从数据库开

Java程序性能优化技巧

多线程.集合.网络编程.内存优化.缓冲..spring.设计模式.软件工程.编程思想 1.生成对象时,合理分配空间和大小new ArrayList(100); 2.优化for循环Vector vect = new Vector(1000);for( inti=0; i<vect.size(); i++){ ...}for循环部分改写成:int size = vect.size();for( int i=0; i>size; i++){ ...} 如果size=1000,就可以减少1000次si

《Java程序性能优化》学习笔记 Ⅰ设计优化

豆瓣读书:http://book.douban.com/subject/19969386/ 第一章 Java性能调优概述 1.性能的参考指标 执行时间: CPU时间: 内存分配: 磁盘吞吐量: 网络吞吐量: 响应时间: 2.木桶定律   系统的最终性能取决于系统中性能表现最差的组件,例如window系统内置的评分就是选取最低分.可能成为系统瓶颈的计算资源如,磁盘I/O,异常,数据库,锁竞争,内存等. 性能优化的几个方面,如设计优化,Java程序优化,并行程序开发及优化,JVM调优,Java性能调

[JAVA] java程序性能优化

一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子: import java.util.vector; class cel { void method (vector vector) { for (int i = 0; i < vector.size (); i++) // violation ; // ... } } 更正: class cel_fixed { void metho

Java程序性能优化之代理模式

代理模式的用处很多,有的是为了系统安全,有的是为了远程调用,这里我们,主要探讨下由于程序性能优化的延迟加载. 首先我们来看下代理模式设计 先首先简单阐述下什么叫代理模式吧 代理设计模式有一个接口,另外还有真实主题类和代理类,真实类和代理类都实现了接口,代理类和真实主题类是关联和聚合关系.客户端与接口关联. 代理分为静态代理和动代态代理所谓静态代理是为真实主题手动创建一个代理,而动态代理则是jvm在运行时运用字节码加载技术自动创建一个代理,并不用关心接口和真是主题类 具体如何实现 哦,对了差点忘了

Java程序性能优化:代码优化

现在计算机的处理性能越来越好,加上JDK升级对一些代码的优化,在代码层针对一些细节进行调整可能看不到性能的明显提升, 但是我觉得在开发中注意这些,更多的是可以保持一种性能优先的意识,对一些敲代码时间比较短的同学挺有意义的. 一 循环条件下,循环体和判断条件中,都要避免对使用复杂表达式,减少对变量的重复计算 1.在循环中应该避免使用复杂的表达式. 在循环中,循环条件会被反复计算,应该避免把一些计算放在循环进行的部分中,程序将会运行的更快.比如: for(int i=0;i<list.size();

关于程序性能优化基础的一些个人总结

性能点: I/O,系统调用,并发/锁,内存分配,内存拷贝,函数调用消耗,编译优化,算法 I/O性能优化: I/O性能主要耗费点:系统调用,磁盘读写,网络通讯等 优化点:减少系统调用次数,减少磁盘读写次数,减少阻塞等待 优化手段: a. 使用非阻塞模式 b. 使用带缓存的I/O,减少磁盘读写次数 c. I/O多路复用,select/poll/epoll d. 异步I/O 系统调用: 耗费点:用户态和系统态切换时耗 优化点:减少不必要的系统调用 优化手段: a. I/O操作,根据具体情况,使用std

Java程序性能优化——设计优化

原文出自:http://blog.csdn.net/anxpp/article/details/51914119,转载请注明出处,谢谢! 1.前言 OK,之前写了一篇文章:"23种设计模式介绍以及在Java中的应用"详细介绍了如何将设计模式应用到Java编程中,而本文旨在介绍如何利用他们优化我们的程序,使其性能更佳. 设计模式的详细介绍请参照上面链接中的文章,不是本文的重点. 而Java程序的性能优化,不一定就仅仅是以提高系统性能为目的的,还可能是以用户体验.系统可维护性等为目的. 2

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

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