對比JIT和AOT,各自有什麼優點與缺點?

1.JIT (Just-In-Time - 實時編譯) 和 AOT (Ahead-Of-Time - 預先編譯),各自有什麼優點與缺點?

請比較一下兩者,作出解釋。謝謝你。

JIT 例子.......: Dalvik

AOT 例子....: ART (Android Runtime)

2.聽說用AOT的ART會在軟體安裝時編譯,使以後軟體打開的速度增加。

在桌面電腦裡,Java有沒有相關的AOT編譯器可安裝來取代JIT?


在這裡我假設JIT和AOT都是純粹的JIT和AOT,而沒有【在AOT的時候偶爾來一下JIT】這樣的不純潔的事情。

AOT是事先生成機器碼,其實就跟C++這樣的語言差不多。選擇這麼做通常都會意味著你損失了一個功能——譬如說

  1. C#的【虛函數也可以是模板函數】功能啦;
  2. 【用反射就地組合成新模板類(你有List&<&>,有int,代碼裡面沒出現過List&,你也可以new出來,C++怎麼做都不行的)】功能啦;
  3. 【class Fuck&{public Fuck&&> Shit{get;set;}}(C++這麼干編譯器會傻逼啊哈哈哈)】功能啦;

所有這些功能都要求你必須運行到那才產生機器碼的。

JIT還有一個好處就是做profiling based optimization方便。當然,這樣就使得運行的時候會稍微慢一點點,不過這一點點是人類不可察覺的。

所以,靠譜的做法大概還是,你上傳你的app,伺服器幫你在支持的平台每一個都AOT一次,順便帶個小runtime以供JIT,然後你下載的時候按需下載。


aot執行快 安裝慢 占內存占外存大

jit反之 執行慢一點 安裝快 占空間小一點

另外 aot系統升級會奇慢無比


恩,我最近在看一本初級的LLVM相關的書,《Getting Started with LLVM
Core Libraries》。 上面有把這些仔細論述過的,建議你看看。


在android裡面,jit會把程序實時編譯為機器位元組碼,然後虛擬機讀取,打開程序~而aot是在安裝的時候預先打包好了位元組碼放在手機內部儲存裡面,打開程序直接讀取預先打包好的玩意就可以了……優缺點就很明顯了吧?jit打開時幹了那麼多事情,速度必定比較慢,aot直接讀取比較快咯……為了干翻ios老是說安卓比較慢的理論~當然aot的問題就是它把程序位元組碼打包放在手機存儲,那就需要更多的安裝的時間還要需要手機內部存儲,媽蛋,你讓那些只有1g rom甚至512m的在這個apk越來越大功能越來越難找的時代還怎麼活……


推薦閱讀:

C++ 為什麼沒有 function 關鍵字?
如何用通俗易懂的語言解釋虛擬存儲器?
計算機語言算不算語言?
國人對於國外CS教材是否存在盲目崇拜心理?
Node.js是用來做什麼的?

TAG:計算機 | Java | 即時編譯JIT | 計算機科學 | 編譯器 |