歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

深層次的挖掘---Java的一些看法JTEK

  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 可進行呼叫、繼承的使用,簡潔的程序代碼就可發揮強大的力量。'




Copyright © Linux教程網 All Rights Reserved