架构深渊

慢慢走进程序的深渊……关注领域驱动设计、测试驱动开发、设计模式、企业应用架构模式……积累技术细节,以设计架构为宗。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

乱弹ASM/C/C++/Java/C#效率

Posted on 2009-01-02 13:09  chen eric  阅读(2269)  评论(2编辑  收藏  举报

 

乱弹ASM/C/C++/Java/C#效率
效率主要有执行效率和开发效率两个方面。
 
这几种语言的开发效率普遍是这样认为的:Java≈C#>C++>C>ASM.
 
C#,Java的开发效率高的主要原因是因为二者本质上都是解释型语言,而不是编译型语言。解释性语言可以利用很多解释型语言专有的特性,如自动垃圾收集,虚拟机提供的一些特殊的功能,比如反射等。以此加快开发速度。第二个原因是二者都是较彻底的面向对象的语言,而面向对象在开发大型系统时结构更清晰,更容易开发,更容易维护。
 
C++也是一门面向对象的语言,不过考虑到执行效率和为了保持和C的兼容性,造成语言的难学难用难以控制,而造成开发难度较大。
 
C是较底层的开发语言,是面向过程的一门语言,较适合于底层开发。ASM也是底层开发,只在对效率严格追求时或用C实现有困难时使用,其开发效率是最低的,但是执行效率最高。
 
不过这只是一般情况,实际情况经常是开发难度经常是有人决定的,一个蹩脚的Java程序员决不可能比高明的C程序员开发效率高。
 
关于执行效率普遍是这样认为的ASM>C>C++>C#>Java。
 
首先应该明确以下几点原则:
1、执行效率主要取决于算法的设计,因为一个好的算法通常是几个数量级的增加执行效率,远远大于由于语言不同带来的效率差别。
2、执行效率还主要取决了系统的构架,系统的设计。一个好的设计可以充分利用系统的资源,可以充分利用语言的优点。
 
 
程序运行时所有的语言最终都是要转化成为机器指令。机器语言和ASM是一一对应的,所以ASM编写的程序可以达到最快的运行效率。然而和C相比,因为现在的编译器优化已经提高很大,一个普通的ASM程序员的编写出来的程序的执行效率未必一定比C的高。
C++在设计时就充分考虑到了执行效率,设计的时候抠点,编程的时候小心点,你写出来的程序执行效率并不会比C慢。
Java和C#本质上时解释型语言,中间隔着一层虚拟机,执行时要通过虚拟机这一层,故执行效率一般比不上C/C++。
 
关于C++和Java/C#的执行效率比较:上面说了C++的执行效率比Java快,不过如果在普通情况下编写程序也未必,这是因为:
1、虚拟机使用了复杂的算法可以提高效率,而C++程序编写时一般不会使用如此复杂的算法。比如好的垃圾收集算法,如Java/C#是成批垃圾收集的等。上面说了,算法才可以极大的提高执行效率,所以两个水平相同的程序执行效率并不会相差很大。Java/C#未必比C++/C慢。
2、现在Java/C#执行都是通过一种即时编译(JIT)方式执行,执行时动态编译成本地代码,所以在运行期间Java的程序不会比C/C++的慢。并且动态编译时可以充分利用硬件的特点优化编译,从而可以获得比C++编译码时更快的执行码。
 
值得一提的是C#各个方面其实和Java几乎一样,不过C#基于的(CLR)中间语言运行环境设计时更充分的考虑了执行效率,底层设计比JVM更为复杂,执行效率更高,并且CLR有把一部分中间语言运行库(CIL)预先编译成本地代码从而更快的提高了执行效率。Java在这一方面做的不足。当然因为C#是Java的改良,所以可以借鉴Java的优点,回避和弥补Java的缺点。
 
最后总结一句话,效率是由人决定的。