乱弹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的缺点。


 


最后总结一句话,效率是由人决定的。