当前位置: 首页 > 互联网 > 正文

浅谈.NET程序的运行效率

也许在平常的程序编写时,我们往往只专注于系统功能的实现与完成,而没有关注系统的运行效率。有时一段代码的两种写法对系统的运行效率有极大的影响,特别是对并发的,多线程的程序来讲,减少系统不必要的开销,节省系统的运行资源,在一定程度上能提高系统的健壮性和稳定性。这也是作为软件开发人员,随着时间的推进,经验的积累,慢慢需要学习和掌握的地方,也是学习的一个方向。作为.NET来讲系统,系统只为我们提供一个方法,但我们要熟知哪些方法的计算可能会造成系统运行效率的下降,用哪些方法会提升运行的效率。这就需要我们熟悉框架的一些本质,比如值类型,引用类型的存储,对象及引用,垃圾回收等等。理解这些对我们编写程序有极大的指引和帮助。下面是我所想到的几点:

拆箱与装箱。装箱操作需要将值类型的数据构造成引用对象,在构造引用对象的时候需要增加一些字段,拷贝数值,并返会对象引用,这一系列的操作会占用运行时间。拆箱的过程又需要将存储在堆中的对象强制转换成值类型返回。这期中而且还容易发生转换错误。整个过程既不安全也没有效率。因此,在我们写代码的过程中要尽可能的避免过多的装箱与拆箱操作。我们可以试着调用值类型的ToString()方法返回值的字符表现形式,用值类型的泛型列表存储相同值类型的列表。因为.NET本身是类型安全的,这样在运行时就减少不必要的类型检测和装拆箱操作,提高程序的效率。

String连接字符串。有时我们很习惯用加号(”+”)来连接字符串。但我们要知道,.NET中字符串常量是不可改变的,也意味着当一个字符串变量改变时,系统需要重新申请一个区域来存储此字符串,而原先的字符串量将被回收。如果我们不断的用字符串本身进行一些操作,就会在系统中不断的创建一个又一个新的字符串,而我们真正可能用到只是最后的几个而已。而这中间创建的字符串,不仅占用了系统的资源还要等待垃圾回收器去回收,而垃圾回收也需要花费时间和资源。因此,当我们要进行频繁的字符串的操作时,可以用StringBuilder类构造对象来进行字符串的操作。只需一个StringBuilder对象就可以完成String操作的很多的功能。节省空间,提升效率。试想当我们在一个网站中如果太多的访问都要频繁的处理String话,不得不考虑这个对系统或是服务器的影响。

数据库访问。频繁的数据库访问可能是系统的一个瓶颈,所以我们在考虑某一个功能操作时,如果需要不断的多次访问数据库时,就要考虑能否进行一些优化。比如,可否将多次访问合并成一次访问,这样就能极大的升运行的效率。比如我们要在程序中将.NET的DATATABLE的记录插入到数据库的表中,方法一是循环每条记录,逐一连接数据库插入到数据库中。方法二,是将若干条记录组成一条语句(Sql允许的长度),然后连接数据库插入到数据库中。方法二中至少我们的数据访问次数会比方法一减少几个倍,这样对系统的效率提升也会有极大的帮助。在写程序的时候我们要经常考虑与外围系统连接时的访问效率,比如I/O或是数据库访问。另外,有的时候我们可以采用.NET多线程的方法,从而能够分担主线程的负担,提升程序运行的效率。

牵涉到.NET运行效率的代码或机制有很多,上面只是一些我现在认识到的一些。很多也只有在了解.NET机制的情况下才能更加清楚的理解和掌握。平常的代码编写过程中不但要专注业务功能的实现,还要在代码的设计,系统的架构上精益求精,让系统运行的更加有效率。这样也要求我们阅读一些关于.NET机制的书籍,比如《CLR via C#》等等。只有掌握一些最基本的原理,再能在此基础上才写出更高质量的代码。

本文固定链接: http://www.byhard.com/?p=1000 | 海纳百川

该日志由 byhard 于2013年06月05日发表在 互联网 分类下,
原创文章转载请注明: 浅谈.NET程序的运行效率 | 海纳百川
关键字: ,

浅谈.NET程序的运行效率:目前有16 条留言

  1. 5楼
    LuckyMoke:

    我第一个评论啊,.net我学的是很头疼了,vs至今都用的不利索!

    2013-06-07 17:39
    • byhard:

      其实很好用,不算难的,相反其它语言我都不太熟悉。

      2013-06-08 08:43
      • 什么都会真心做不来,还是精一门最少不会饿肚子啊!嘿嘿!

        2013-06-08 14:15
        • byhard:

          嗯,说的在理。

          2013-06-08 17:17
  2. 改变、探索的过程,其实都是在追求一种编程的美感。老赵喜欢“不拘一格”,只要是有价值的都会去设法尝试一番,探索的过程会遇到大量问题,解决问题后又能带来成就感以及新的感受。因为美感和成就感,所以产生乐趣,因为乐趣才有源源不断地动力。因为有这样的切身体会,所以在这里也建议大家,不妨放开思路,海纳百川。我们可以获得和想到的东西,远比预料中来的丰富。

    2013-06-07 22:34
    • byhard:

      谢谢

      2013-06-08 08:43
  3. .NET很难学把

    2013-06-08 14:01
    • byhard:

      你说它不难,就很容易吧。

      2013-06-08 17:17
  4. 板凳
    一树小草:

    记得我大二的时候写过一个做图像拼接的程序,其中有一个边缘提取的算法要花10s的时间,就拿子线程做。。。结果因为不会异步回掉最后只能在一个线程执行完毕退出之前后启动下一个子线程(进行下一步计算),代码搞得乱七八糟已经完全不能读了。。。(好吧,我都不确定我有没有把这件事情讲清楚)

    2013-06-14 21:11
    • byhard:

      也许当时沉浸在其中,现在回头来看,也许就清晰自己当初的想法了。话说回来,我大二的时候肯定没你大二知道的多。谢谢来访。

      2013-06-14 23:04
      • 也是。好久没动C#了,什么时候回炉一下。

        2013-06-14 23:11
        • byhard:

          如果喜欢,那就去做吧,加油。

          2013-06-16 21:18
  5. 沙发
    Aivier:

    只会VB.Net,你这篇文章看得我已经彻底晕掉了。。。完全不知道在说什么

    2013-06-28 09:57
    • byhard:

      Really,我表达有那么差吗?VB.NET用的也是托管代码吧,理论上应该大致都通用的。

      2013-06-28 10:22
      • 其实学VB.Net的就这水平了。。。确实通用

        2013-06-28 10:26
        • byhard:

          呵呵,曾经用过一段时间,我主要用的是C#.

          2013-06-28 10:34