Android2.2 jit 的作用

2.2快來了,CM 5.0.7系列也越來越火,我們又更加頻繁的接觸了一個名詞——JIT,但是到底什麼叫JIT,很多人搞不清楚,以下解釋轉自百度和維基:

  百度百科:

  JAVA領域的 JIT

  JITCompiler(Just-in-time Compiler) 即時編譯

  最早的Java建置方案是由一套轉譯程式(interpreter),將每個Java指令都轉譯成對等的微處理器指令,並根據轉譯後的指令先後次序依序執行,由於一個Java指令可能被轉譯成十幾或數十幾個對等的微處理器指令,這種模式執行的速度相當緩慢。

  針對這個問題,業界首先開發出JIT(just in time)編譯器。當Java執行runtime環境時,每遇到一個新的類別(class:類別是Java程式中的功能羣組),類別是Java程式中的功能羣組-JIT編譯器在此時就會針對這個類別進行編譯(compile)作業。經過編譯後的程式,被優化成相當精簡的原生型指令碼(nativecode),這種程式的執行速度相當快。花費少許的編譯時間來節省稍後相當長的執行時間,JIT這種設計的確增加不少效率,但是它並未達到最頂尖的效能,因爲某些極少執行到的Java指令在編譯時所額外花費的時間可能比轉譯器在執行時的時間還長,針對這些指令而言,整體花費的時間並沒有減少。

  基於對JIT的經驗,業界發展出動態編譯器(dynamic compiler),動態編譯器僅針對較常被執行的程式碼進行編譯,其餘部分仍使用轉譯程式來執行。也就是說,動態編譯器會研判是否要編譯每個類別。動態編譯器擁有兩項利器:一是轉譯器,另一則是JIT,它透過智慧機制針對每個類別進行分析,然後決定使用這兩種利器的哪一種來達到最佳化的效果。動態編譯器針對程式的特性或者是讓程式執行幾個循環,再根據結果決定是否編譯這段程式碼。這個決定不見得絕對正確,但從統計數字來看,這個判斷的機制正確的機會相當高。事實上,動態編譯器會根據「歷史資料」做決策,所以程式執行的時間愈長,判斷正確的機率就愈高。以整個結果來看,動態編譯器產生的程式碼執行的速度超越以前的JIT技術,平均速度可提高至50%。

  維基:

  即時編譯(Just-in-timeCompilation,JIT),又稱動態轉譯(Dynamic Translation),是一種通過在運行時將字節碼翻譯爲機器碼,從而改善字節碼編譯語言性能的技術。即時編譯前期的兩個運行時理論是字節碼編譯和動態編譯。

  在編譯爲字節碼的系統如Limb 編程語言,Smalltalk,UCSD P-System, Perl,GNU CLISP,和 Java

#p# #e#

的早期版本中, 源代碼被翻譯爲一種中間表示即字節碼。字節碼不是任何特定計算機的機器碼, 它可以在多種計算機體系中移植。字節碼被解釋着運行在虛擬機裏。

  動態編譯環境是一種在執行時使用編譯器的編譯環境。 例如, 多數 Common Lisp 系統有一個編譯函數,他可以編譯在運行時創建的函數。

  在即時編譯環境下, 字節碼的編譯是第一步, 它將源代碼遞歸到可移植和可優化的中間表示。字節碼被部署到目標系統。當執行代碼時,運行時環境的編譯器將字節碼翻譯爲本地機器碼。 基於每個文件或每個函數:函數僅僅在他們要被執行時纔會被編譯。

  目標是要組合利用本地和字節碼編譯的多種優勢:多數重量級的任務如源代碼解析和基本性能的優化在編譯時處理,將字節碼編譯爲機器碼比起從源代碼編譯爲機器碼要快得多。部署字節碼是可移植的,而機器碼只限於特定的系統結構。從字節碼到機器碼編譯器的實現更容易,因爲大部分工作已經在實現字節碼編譯器時完成。

  胡扯:

  好,說白了,JIT 在Android方面其實現實際上是在 Dalvik vm這一層,與內核是分離的,直觀的表現就是幾個庫文件。

  然後,JIT到底能提升機器多大的性能?我也不知道——不要跟我說Linpack跑多少分,學計算機的都知道,Linpack只是一個基準測試程序,測試的是機器的浮點計算能力、向量性能和高速緩存性能。Linpack只是衆多基準測試的一種,它的分數代表不了任何東西。它只有一個局部的計算性能參考

  然後,爲什麼使用了JIT之後,Linpack的分數就能提高很多?OK,看 Linpack是幹什麼的——有一項是測試高速緩存的,那麼,使用JIT之後,一部分Dalvik的字節碼(apk程序包的邏輯部分,如*.dex 和*.odex)會被轉譯成手機CPU的指令代碼,那好,這部分代碼就可以進行重用,減少了編譯的時間,這就相當於一個“緩存”,使得訪問Dalvik字節碼的次數大大降低,也就是減少了解釋執行字節碼的次數。要知道,解釋執行字節碼的速度是比較慢的,所以直接體現就是Linpack分數的提高。

  那麼,JIT對我們使用的影響大麼?

  準確的說,有,但不是很大,根本達不到Froyo 2.2宣傳的那樣(我恨IT媒體)幾倍的提升。爲什麼?因爲我們用的系統不光有邏輯(程序執行),還有UI(圖形渲染),以及其他很多因素(線程調度、 I/O等等),單獨的JIT技術只是提高了程序代碼的執行效率(還不是全部),並未對系統有全局優化的功效。如果可以的話,可以針對Linpack專門設計一個優化的虛擬機,讓G2這樣的機器跑到30分也是沒問題的。但是實際使用的體驗不會好很多。

  所以,不要迷信~


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章