zoukankan      html  css  js  c++  java
  • 盘点.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 ) 页

  • 相关阅读:
    D365FO Debug找不到w3cp进程
    D365FO 10.0PU32 开发环境 Data Management导出失败
    一张图看懂项目管理
    用户体验为什么重要?如何提升产品的用户体验?(写给产品小白)
    敏捷考证?你应该知道的敏捷体系认证(最全名单)
    漫画:禅道程序员的一天
    敏捷开发管理--任务分解经验之谈
    漫画:优秀程序员的必备特质有哪些?
    漫画:女生/男生告白攻略
    漫画:程序员脱单秘籍
  • 原文地址:https://www.cnblogs.com/smallfa/p/1631527.html
Copyright © 2011-2022 走看看