Dict.CN 在线词典, 英语学习, 在线翻译 ------------- MyGitee 朱秋贵内科诊所 My腾云code

盘点.NET的性能优化策略

盘点.NET的性能优化策略

 

作者:王涛    日期:2008-2-22

本文将介绍以下内容:

—  .NET性能优化的策略探讨

— 多种性能优化分析

引言

性能是系统设计的重要因素,然而影响系统性能的要素又是多种多样,例如硬件环境、数据库设计以及软件设计等等。本文将关注集中在.NET中最常见的性能杀手,并以条款的方式来一一展现,某些可能是规则,某些可能是习惯,而某些可能是语法。

本文在分析了.NET自动内存管理机制的基础上,来总结.NET开发中值得关注的性能策略,并以这些策略作为选择的依据和平衡的杠杆。同时,本文的优化条款主要针对.NET基础展开,而不针对专门的应用环节,例如网站性能优化、数据库优化等。

孰优孰劣,比较应用中自有体现。

性能条款

Item1:推荐以Dispose模式来代替Finalize方式。

关于非托管资源的清理,主要有终止化操作和Dispose模式两种,其中Finalize方式存在执行时间不确定,运行顺序不确定,同时对垃圾回收的性能有极大的损伤。因此强烈建议以Dispose模式来代替Finalize方式,在带来性能提升的同时,实现了更加灵活的控制权。

Item2:在适当的情况下对对象实现弱引用。

为对象实现弱引用,是有效提高性能的手段之一。弱引用是对象引用的一种“中间态”,实现了对象既可以通过GC回收其内存,又可被应用程序访问的机制。这种看似矛盾的解释,的确对胖对象的内存性能带来提升,因为胖对象需要大量的内存来创建,弱引用机制保证了胖对象在内存不足时GC可以回收,而不影响内存使用,在没有被GC回收前又可以再次引用该对象,从而达到空间与时间的双重节约。

在.NET中,WeakReference类用于表示弱引用,通过其Target属性来表示要追踪的对象,通过其值赋给变量来创建目标对象的强引用,例如:

public void WeakRef()
{
MyClass mc = new MyClass();

//创建短弱引用
WeakReference wr = new WeakReference(mc);
//移除强引用
mc = null;

if (wr.IsAlive)
{
//弱引用转换为强引用,对象可以再次使用
mc = wr.Target as MyClass;
}
else
{
//对象已经被回收,重新创建
mc = new MyClass();
}
}

Item3:推荐使用泛型集合来代替非泛型集合。

泛型实现了一种类型安全的算法重用,其最直接的应用正是在集合类中的性能与安全的良好体现,因此我们建议以泛型集合来代替非泛型集合,以List<T>和ArrayList为例来做以说明:

public static void Main()
{
//List<T>性能测试
List<Int32> list = new List<Int32>();
for (Int32 i = 0; i < 10000; i++)
//未发生装箱
list.Add(i);

//ArrayList性能测试
ArrayList al = new ArrayList();
for (Int32 j = 0; j < 10000; j++)
//发生装箱
al.Add(j);
}

上述示例,仅仅给出了泛型集合和非泛型集合在装箱操作上引起的差别,同样的拆箱操作也伴随了这两种不同集合的取值操作。同时,大量的装箱操作会带来频繁的垃圾回收,类型转换时的安全检查,都不同程度的影响着性能,而这些弊端在泛型集合中荡然无存。

必须明确的是,泛型集合并不能完全代替非泛型集合的应用,.NET框架类库中有大量的集合类用以完成不同的集合操作,例如ArrayList中包含的很多静态方法是List<T>所没有的,而这些方法又能为集合操作带来许多便利。因此,恰当地做出选择是非常重要的。

注意,这种性能差别对值类型的影响较大,而引用类型不存在装箱与拆箱问题,因此性能影响不是很明显。

回到首页


共 3 页 |第 ( 1 )( 2 )( 3 ) 页

posted @ 2009-12-24 16:17  cn2023  阅读(258)  评论(0编辑  收藏  举报