Java Chip 是 Optimized for Java 的 OOP、eXPtion-handling、memory/garbage collection 的特制 chip,而 x86 (即传统 CPU) 并没有针对 C++ 所编译的 machine code 中的 new/exception-handling/memory allocation/late-binding 作硬件支持的最佳化动作。 拜 VLSI 之赐,memory allocation 以及 garabage collection 的动作可交由硬件来实作。在 modem 或电视中,用以数字模拟转换的 DSP (数字讯号处理) chip 而言,有所谓的 bit-reverse (作 FFT [快速傅立叶转换] 用的),倘若以一般 x86 来做这个动作,起码慢 10 倍以上。又如以往的浮点咚悖日麛颠算慢了 20 ~ 30 倍,但因有了浮点加速器的出现,浮点咚愕乃俣瓤蔀檎麛颠算的 1.3 倍! 前述提到将 JVM 以 co-processor 形式实作的方式,可以参考 Nazomi Communica-tions [2] 公司的产品,他们推出一套 Java 加速芯片,这个代号为 JA108 的产品专门针对 2G/2.5G 或 3G 的手机使用。不需要加装额外的内存,只需将这 JA 208IC 植入原有系统设计中,便可大幅提升 Java 应用程序效率达 15 至 60 倍。 接着,笔者在 Pentium II 上咦? Linux 进行以下实验:(原始码与machine code 的对照) c++ 的 virtaul method calling: ┌──────────────────────────┐ │21: testx -> setx(20); // testx 是一个指针对象 │ │──────────────────────────│ │00401091 push 00000014 │ │00401093 mov eax,dWord ptr [testx] │ │00401096 mov eax,dword ptr [eax] │ │00401098 mov ecx,dword ptr [testx] │ │0040109b call dword ptr [eax] │ └──────────────────────────┘ 不算 argument 4 个指令 c 的一般 call: ┌───────────────────────────┐ │ good() │ │───────────────────────────│ │0040109f call @ILT+0(?good@@YAXH@Z) (00401000) │ │004010a4 add esp,00000004 │ └───────────────────────────┘ 不算 argument 2 个指令 java 的 virtual call: ┌───────────────────────────┐ │my.getData(33); │ │───────────────────────────│ │ aload_2 │ │ bipush 33 │ │ invokevirtual #9 │ └───────────────────────────┘ 不算 argument 2 个指令. c++ 的 constrUCtor: ┌────────────────────────────┐ │test *testx = new test(); │ │────────────────────────────│ │00401056 push 00000008 │ │00401058 call ??2@YAPAXI@Z (00401184) │ │0040105d add esp,00000004 │ │00401060 mov dword ptr [ebp-0c],eax │ │00401063 cmp dword ptr [ebp-0c],00000000 │ │00401067 je main+00000030 (0040107d) │ │0040106d mov ecx,dword ptr [ebp-0c] │ │00401070 call @ILT+15(??0test@@QAE@XZ) (0040100f)│ │00401075 mov dword ptr [testx],eax │ │00401078 jmp main+00000037 (00401084) │ │0040107d mov dword ptr [testx],00000000 │ └────────────────────────────┘ 11 个指令 C++ destructor: ┌───────────────────────────┐ │delete testx; │ │───────────────────────────│ │004010a7 mov eax,dword ptr [testx] │ │004010aa mov dword ptr [ebp-10],eax │ │004010ad mov eax,dword ptr [ebp-10] │ │004010b0 mov dword ptr [ebp-14],eax │ │004010b3 mov eax,dword ptr [ebp-14] │ │004010b6 push eax │ │004010b7 call ??3@YAXPAX@Z (00401194) │ │004010bc add esp,00000004 │ └───────────────────────────┘ 8 个指令 java 的 constructor: ┌───────────────────────────┐ │my my1 = new my(); │ │───────────────────────────│ │new #2 │ │invokenonvirtual #11 ()V> │ └───────────────────────────┘ 2 个指令 由此可发现,对动态配置对象的操作而言,Java 一个 method call 只要一个machine code,但用 x86 相对需要 4 个,这是 Java 在指令集层面直接支持所致。我们显而易见 Java 的一个优势 —─ 目的码很小,可轻易置于资源困窘的家电设备中,再加上许多现成的 APIs 可进行呼叫、继承的使用,简洁的程序代码就可发挥强大的力量。'
[1] [2] 下一页
(出处:http://www.sheup.com)
上一页 [1] [2]