U9性能优化课程编号:用友软件股份有限公司U9客户化开发支持部杜华侨2009年6月21日C#语言ADO.NETASP.NETJavaScript数据库操作U9平台C#语言垃圾回收String操作多线程类型系统异常系统基本代码技巧C#语言-垃圾回收避免不必要的对象创建避免循环创建对象在需要的逻辑分支中创建对象使用常量避免创建对象使用StringBuilder做字符串连接不要使用空析构函数实现IDisposable接口回收非托管资源C#语言-垃圾回收避免不必要的对象创建避免循环创建对象如果对象并不会随每次循环而改变状态,那么在循环中反复创建对象将带来性能损耗.高效的做法是 将builder对象提到循环外面创建在需要的逻辑分支中创建对象如果对象只在某些逻辑分支中才被用到,那么应只在该逻辑分支中创建对象高效的做法是 将对象创建过程放到if块里面C#语言-垃圾回收使用常量避免创建对象如下例,程序中存在大量new decimal(0)的代码,这会导致小对象频繁创建及回收.正确的做法是 使用Decimal.Zero常量使用StringBuilder做字符串连接C#语言-垃圾回收不要使用空析构函数包含析构函数的对象要经过两次垃圾收集才能回收,对性能影响较大空析构函数说明在对象释放之前不需要做什么操作C#语言-垃圾回收实现IDisposable接口垃圾回收的运行时间不确定,依赖垃圾回收可能会耗尽非托管资源调用Dispose的方法调用try„finally语句块使用using语句实现注意事项在Dispose方法中,调用System.GC.SuppressFinalize(this)。C#语言-String操作使用StringBuilder做字符串连接String是不变类,使用+操作连接字符串会导致创建一个新的字符串对于只有几次的连接,可以使用”+”连接,因编译器已经做了优化,会依据加号次数调用不同参数个数的String.Concat方法。例如String str = str1+str2+str3+str4;会被编译为String.Concat(str1,str2,str3, str4)。该方法内部会计算总的String长度,仅分配一次,并不会如通常想象的那样分配三次。StringBuilder内部Buffer的缺省值为16,这个实在太小。按StringBuilder的使用场景,Buffer肯定得重新分配。我们建议使用256作为Buffer的初值。当然,如果能计算出最终生成字符串长度的话,则应该按这个值来设定Buffer的初值。示例:StringBuilder sb = new StringBuilder(256);for (int i = 0; i < Results.Count; i++){sb.Append(Results[i]);}C#语言-String操作避免不必要的调用ToUpper或ToLower方法String是不变类,调用ToUpper或ToLower方法都会导致创建一个新的字符串。如果被频繁调用,将导致频繁创建字符串对象。这违背了前面讲到的“避免频繁创建对象”这一基本原则掌握使用Compare方法做忽略大小写比较高效的做法是使用Compare方法使用StringComparer.OrdinalIgnoreCase创建key值大小写不敏感的HashtableC#语言-多线程线程同步可以选择的线程同步的方法选择线程同步的范围保证集合操作的线程安全使用线程变量使用DoubleCheck技术创建单例对象的技巧C#语言-多线程可以选择线程同步的方法使用C#提供的Monitor、Mutex、AutoResetEvent和ManualResetEvent对象使用lock语句用MethodImpl(MethodImplOptions.Synchronized)修饰同步整个方法C#语言-多线程选择线程同步范围是同步整个方法还是同步一段代码?推荐应减少同步的范围,使系统获得更好的性能。使用lock语句时,是选择Type、this,还是构造专门用于同步的变量?推荐构造的专门用于同步的变量。锁定 Type、不但会影响性能,还可能导致一些无法预期的行为MethodImpl(MethodImplOptions.Synchronized) 锁定的对象是什么?对静态方法,锁定的是 Type;对实例方法,锁定的this.C#语言-多线程保证集合操作的线程安全使用集合类的SyncRoot属性优点:控制精细,性能较好缺点:需要自己判断合适需要lock 集合的SyncRoot属性使用集合类的Synchronized包装器优点:操作简单缺点:同步了集合类的所有方法,性能开销较大C#语言-多线程使用线程局部存储变量使用ThreadStatic属性修饰类的静态成员使用NamedDataSlot和Thread.GetData 方法因前者的开销比后者小的多,建议使用ThreadStatic替代NamedDataSlot。C#语言-多线程使用Double Check技术...