LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 743|回复: 0

java的一些看法JTEK

[复制链接]
发表于 2004-10-6 11:47:25 | 显示全部楼层 |阅读模式
java的一些看法JTEK



「模擬」既然非真,當然在效率上就較吃?了,所以就常給人 Java 執行超慢、超耗
資源的印象,其?那是指 Virtual Machine 的效能。為了改進 JVM 效能,使用許多
技術加速,其中最重要的莫如 JIT (Just In Time) Compiler (及時編譯器,注意:
不要跟「即時」[realtime] 搞混) 與 HotSpot 的 Adaptive Compiler 等 dynamic
compilation 技術。

Java Chip 是 Optimized for Java 的 OOP、exption-handling、memory/garbage
collection 的特製 chip,而 x86 (即傳統 CPU) ?K沒有針對 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 208
IC 植入原有系統設計中,便可大幅提升 Java 應用程式效率達 15 至 60 倍。
[2] http://www.nazomi.com/

接著,筆者在 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 可進行呼叫、繼承的使用,簡??的程式碼就可發揮?姶
的力量。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表