java为什么没有c/c++运行速度快
1、Java不一定效率就比C++低。一般情况下,Java的效率和C++处于一个数量级,少数情况下Java会比C++更快。
2、现在根本没有所谓的解释性语言和编译性语言之分。Java一样能通过jaotc,gcj或者Excelsior Jet之类的编译器编译成机器码,C++一样能够通过解释器解释执行
3、Java虚拟机的主流实现Hotspot里自带一个JIT编译器,能够把字节码编译成机器码。JIT虽然需要运行时编译,但是能够做更多优化,“效率高低显而易见”根本是无稽之谈。
4、“比如java程序不能直接管理内存”更是错错错,通过Unsafe或者JNI,Java应用意义能够直接管理内存,譬如Spark的一部分就是自己管理了一块内存。
5、“虽然这样会造成程序员的工作量加大,但是内存的利用率肯定是比java要高的”更是错的,gc比人工管理要靠谱多了,C++里的内存泄露到现在都无法避免。
6、“个人感觉应该是垃圾回收的问题”也是错的,Java应用吃内存主要还是过多的new以及JVM本身占用的原因,gc的影响相对来说要小得多。
7、“虚拟机就相当于一个操作系统”“通过虚拟操作系统将指令传递到实际操作系统肯定是效率较低的”简直错到离谱,JNI和JIT都被你吃了啊?
从几个方面讲:
首先,java和C/C++是不同类型的语言,java是解释型语言,C/C++是编译型语言,效率上肯定是编译型语言要高。为什么这么说呢?所谓解释型语言就是不实际生成可执行代码,比如java编译后生成的是.class字节码,然后通过java虚拟机去解释这个字节码然后生成二进制代码,计算机去执行解释后的二进制代码,这就经过一次翻译。而编译型语言生成的直接就是计算机可识别的二进制代码。效率高低显而易见。
其次,java不能直接与系统或者硬件设备打交道,全都是通过jvm虚拟机来执行的。比如java程序不能直接管理内存,而是所谓垃圾收集器管理的,垃圾收集何时执行时不确定的。而C/C++可以直接管理内存,通过指针,在堆上的对象创建和销毁要全部依赖程序员来完成。虽然这样会造成程序员的工作量加大,但是内存的利用率肯定是比java要高的
还有,java的执行需要一个虚拟机环境,这个东西是比较吃内存的,有过java编程经验的人都知道,eclipse/myeclipse之类的工具执行起来占用的内存比较大。个人感觉应该是垃圾回收的问题,因为垃圾回收不定时,所以其实内存中存在很多已经被废弃的对象,但是它们还占用着内存。虚拟机就相当于一个操作系统,在实际的操作系统上跑一个操作系统,然后java程序在虚拟操作系统上运行,通过虚拟操作系统将指令传递到实际操作系统肯定是效率较低的。C/C++不存在这种问题,它们生成的程序都是直接运行在实际的操作系统上面的
广告 您可能关注的内容 |