一、面对对象与面对过程差别
- 面向过程 :面向过程性能比面向对象高。 因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素的时候,比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发。但是,面向过程没有面向对象易维护、易复用、易扩展。
- 面向对象 :面向对象易维护、易复用、易扩展。 因为面向对象有封装、继承、多态性的特性,所以可以设计出低耦合的系统,使系统更加灵活、更加易于维护。但是,面向对象性能比面向过程低。
二、java性能低的原因
引用JavaGuide里的一段话
面向过程也需要分配内存,计算内存偏移量,Java性能差的主要原因并不是因为它是面向对象语言,而是Java是半编译语言,最终的执行代码并不是可以直接被CPU执行的二进制机械码。而面向过程语言大多都是直接编译成机械码在电脑上执行,并且其它一些面向过程的脚本语言性能也并不一定比Java好。
通过这段话可能了解的不是很透彻,因为没有提到java实际是什么语言。而实际上,java是半编译半解释语言。具体来看看百度百科对编译语言与解释语言的定义:
编译型语言:程序在执行之前需要一个专门的编译过程,把程序编译成 为机器语言的文件,运行时不需要重新翻译,
直接使用编译的结果就行了。
解释型语言:程序不需要编译,程序在运行时才翻译成机器语言,每执 行一次都要翻译一次。
比如我们现在有使用高级语言编写的10行代码的程序: 如果它是使用编译型语言编写的,那么它的执行方式就是:
先把这10行代码通过编译器全部编译成机器指令码的文件,然后再让计算机运行。
如果它是使用解释型语言编写的,那么它的执行方式就是:通过解释器一行一行的将代码翻译成机器指令码执行。
而对于Java代码来说,是将源文件(.java文件)先编译成字节码文件(.class文件),然后再在Java虚拟机(JVM)中解释执行。
- 那么什么又是字节码文件?
- 字节码:Java源代码经过虚拟机编译器编译后产生的文件(即扩展为.class的文件),它不面向任何特定的处理器,只面向虚拟机。
- 采用字节码的好处:
- Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以Java程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java程序无须重新编译便可在多种不同的计算机上运行。
在Hotspot(Java虚拟机中的一种)中存在JIT即时编译器,能够捕获程序中的热点代码,编译成机器码缓存起来存入方法区中,当遇到相同的代码时,不必再去使用解释器翻译,直接去找对应的机器码执行。避免解释器重复多次的解释执行。