java

位置:IT落伍者 >> java >> 浏览文章

正确认识java JVM与c/c++的执行效率


发布日期:2018年12月29日
 
正确认识java JVM与c/c++的执行效率

认为Java不能写JVM是完全错误的JNode是一个用Java写的开源操作系统他里面的JVM就是用Java写的这个操作系统现在有几十兆其中 %的代码是用java编写其中只有一个极小的操作系统引导程序是用汇编写的我们暂时称之为booterexe大小为几KB

booterexe的作用就是将用java写的JVM编译并装入内存简单的说就是将JVMclass编译成JVMexe(JVMexe也是内存中的二进制代码并不是真实存在的文件我暂时称之为JVMexe) 这个过程花了秒种

在这个操作系统中汇编程序只能执行秒钟之后汇编程序就退出内存也再也不执行了内存中只剩下用Java写的JVMexe

之后所有的操作都有JVMexe来进行JVMexe负责将其它的AbcclassDefclass等等编译成AbcexeDefexe操作系统正式启动

JNode的官方网站上有Java写的JVM的性能和SUN的JVM进行性能比较的结果JNode中用Java写的JVM竟然能比SUN公司用C++写的JVM还快!见

结果如下

运行评测程序ArithOpt时

JNode ms*

Sun JSDK ms**

JNode的官方网站上有Java写的JVM的性能和SUN的JVM进行性能比较的结果JNode中用Java写的JVM竟然能比SUN公司用C++写的JVM还快!见

结果如下

运行评测程序ArithOpt时

JNode ms*

Sun JSDK ms**

上面JNode 中用Java写的JVM与Sun 的用C++写的JVM的比较是在Pentium Ghz with GB of memory上比较的

其实无论是c++javavbdelphi还是perl他们最终在cpu中执行时都是二进制代码没有本质区别他们的差别就在于不同的编译器编译出来的二进制代码的优化程度不同用程序员直接写出的汇编由于没有进行深入的优化很难达到其它用java/c++/delph/vb编译器的优化程度所以我说手写汇编的速度达不到c++/java的速度实质就是说手写汇编再编译出来的二进制代码的优化程度没有用c++ /java编译器编译出来的二进制代码的优化程度高

底层用C++或汇编来写并不是因为他们更快而是因为他们更节省内存操作硬件更方便VB是一种解释语言它的内存占用量也很大而且VB中直接操作内存等硬件的方法并不多而且C++已经有许多已经成型的类库用C++写JVM明显比VB强如果你感觉eclipse或永中慢就认定Java慢那么大家感觉WindowsXP慢是不是大家就应该认定 C++慢 呢?谁快谁慢拿数据说话吧

另外不要因为某些java程序启动慢就认定java慢这除了因为上面说的原因外还因为

C++启动较快也不全是因为C++本身的原因许多C++写的软件所需的一些exe和dll在操作系统启动时就已经启动了(比如和窗口相关的一些dll)

NET程序启动较快就是因为NET的虚拟机其实在操作系统启动时就已经启动了

而其它一些大型软件如Microsoft Word启动较快就是因为操作系统启动时就已经启动了和Word相关的一些服务和功能

当然对于能直接支持java bytecode的CPUbooterexe也可以不需要只要有个Booterclass就可以这样整个操作系统就%都是java写的了

还有就算在不支持java bytecode的cpu上也可以用java来写booterexe

原理很简单写个 Booterjava将它编译成Booterclass再用Java写个class to exe编译器将Booterclass编译成Booterexe这次Booterexe不仅存在于内存中还可以将它写到硬盘上这用 Java编译出来的Booterexe所有的功能都和用汇编写的booterexe完全一样

从此我们就得到了一个%的纯Java操作系统

完全可以用Delphi写一个C++编译器再用这个编译器去编译abccpp的源代码难道编译出来的abcexe就变成了delphi程序吗?一个二进制代码是用什么语言写成的是由它是由什么编译器编译出来决定的而不是由它的编译器是由什么语言写成的决定的

所以Java程序不是C++程序因为无论Java的编译器是用VBperlC++还是汇编写成的只要编译编译的是Abcjava的源代码这就是个java程序

举个例子种java编译器一种是用VB写成的一种是用C++写成的一种是用Delphi写成的一种是用Perl写成的他们都去编译 Abcjava的源代码:

VB 写的java编译器将Abcjava编译成Abcclass用了

C++ 写的java编译器将Abcjava编译成Abcclass用了

Delphi写的java编译器将Abcjava编译成Abcclass用了

Perl 写的java编译器将Abcjava编译成Abcclass用了

最后编译出来的Abcclass完全一样那么这个编译出来的Abcclass在同一个虚拟机上运行时的性能完全一样难道这可以证明VBC++DelphiPerl的性能完全一样吗?

再举个例子种java虚拟机(JVM)一种是用 VB写成的一种是用C++写成的一种是用Delphi写成的一种是用Perl写成的他们都去运行Abcclass的java文件实际运行过程是这样的JVM先把Abcclass编译成Abcexe(其实只是内存中的二进制指令序列没有这个文件为了便于理解我给出名 Abcexe)然后CPU运行Abcexe由于四种JVM(VbJVMCppJVMDelphiJVMPerlJVM)编译出来的 Abcexe完全一样所以四种JVM在运行 Abcexe时的性能完全一样差距只在于种JVM将Abcclass编译成Abcexe所有的编译所花费的时间不同

CppJVM 将Abcclass编译成Abcexe花 然后Abcexe运行花费

VbJVM 将Abcclass编译成Abcexe花 然后Abcexe运行花费

DelphiJVM将Abcclass编译成Abcexe花 然后Abcexe运行花费

PerlJVM 将Abcclass编译成Abcexe花 然后Abcexe运行花费

大家可以看到虽然VbJVM编译Abcclass的速度只是CppJVM的十分之一但Abcclass在VbJVM和在CppJVM上运行所花的时间几乎完全一样难道这样能证明VB和C++性能一样?当然不能!也就是说Java程序运行所花费的时间与JVM是用什么写成的几乎没有关系!哪怕这个JVM是用最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最快的语言写的将Abcclass编译成Abcexe只用了 最终也几乎不会影响Abcclass在这个JVM上运行的时间

最终得出结论Java的速度与JVM是用什么语言写成的几乎没有关系

而Java的本地代码是用Java的JIT和HotSpot编译器在程序运行时编译出来的根本不是C++编译器编译出来的所以java程序根本不是一个C++程序!

JIT和HotSpot编译器可以根据程序运行的CPU进行指令集进行优化C++编译器可以吗?

JIT和HotSpot编译器可以根据程序运行时的profile对本地代码进行inline等优化C++编译器可以吗?

JIT和HotSpot编译器可以根据程序运行时根据程序运行的情况进行更准确的分支预测C++编译器可以吗?

大家可以去jre的安装路径中去看看

其中的jar文件共有50由于jar文件是压缩文件并且bytecode的代码要比native code精简的多(前面已经说过了一个构造方法在bytecode中只要一个指令构造方法在C++的编译器却要个指令Java 一个 method call 只要一个machine code但用 x 相对需要 个)所以这50M的java程序完成的工作大约相当于200M以上的本地代码完成的工作

而其中的exe和dll共有M本地代码在java运行环境中占的比例连5%都不到

而这仅有的5%的C++编译器产生的本地代码(比如AWTdll)在java程序运行时还要被JIT和HotSpot编译器重新编译成新的指令序列 (例如符合SSE的指令集的指令)并根据运行时的profile 来内联到其它java编译器编译出来的native code中成为全新的NativeCode序列

所以C++编译器编译出来java本地库的机器代码序列在java运行的时候根本看不到这些机器代码也被Java的JIT和HotSpot编译器重新编译并更改执行序列这些C++编译器编译出来的机器代码已经变成了Java编译器编译出来的机器代码最终在CPU中执行的所有机器语言序列全部是由Java编译器产生的与C++编译器没有一点关系

C++的速度是由C++编译器在程序员开发时编译出来的机器语言的优化程度决定的

Java的速度是由Java的JIT和HotSpot编译器将java bytecode在运行时即时编译成针对本地CPU的优化的本地代码决定的

比速度的实际就是在比看C++编译器和java编译器谁能产生更优化的机器代码

很明显C++的编译器不如java的JIT和HotSpot编译器因为JIT和HotSpot编译器能针对CPU指令集进行人优化能在运行时根据使用频率对method进行内联和优化而C++的静态编译器永远也做不到这些

两者有着本质的不同但是有些人用一辈子也无法理解这其中的差别

他们只能抱着一个可怜的没有任何根据C++比Java快终其一生

上一篇:Java实现拼图游戏

下一篇:浅谈Java网站开发过程中的优势