帶你從底層詳細剖析Android性能落後於iOS之語言篇

文章推薦指數: 80 %
投票人數:10人

一直以來Android性能一直落後於iOS,即使在Android系統的手機配置高於蘋果手機許多的情況下仍然處於下風,本文帶你從開發語言角度解釋其中的重要原因,大家都知道Android系統的應用程式一般都是用Java進行開發的,Java的內核是由c編寫,而iOS的應用程式採用object-c進行開發。

下面先具體看一下這兩種語言

java是解釋型語言,object-c編譯型語言

解釋性語言在運行程序的時候才翻譯,比如解釋性basic語言,專門有一個解釋器能夠直接執行basic程序,每個語句都是執行的時候才翻譯。

這樣 解釋性語言每執行一次就要翻譯一次,效率比較低。

解釋型語言,執行速度慢、效率低;依賴解釋器、跨平台性好。

如Java、Basic。

編譯型語言:把做好的源程序全部編譯成二進位代碼的可運行程序。

然後,可直接運行這個程序。

編譯型語言,執行速度快、效率高;依賴編譯器、跨平台性差些。

如C、C++、object-c、Delphi、Pascal,Fortran。

jvm和gcc

java是一種解釋型語言,它的編譯器不是直接變異成機器指令,而只需生成在Java虛擬機(jvm)上運行的目標代碼(二進位字節碼),就可以在 多種平台上不加修改地運行。

Java虛擬機在執行字節碼時,把字節碼解釋成具體平台上的機器指令執行。

這就是Java的能夠「一次編譯,到處運行」的原 因。

gcc全稱GNU編譯器套件(GNU Compiler Collection),它把object-c編譯成機器指令。

顯而易見,java是解釋型語言,每條語句在執行的時候才翻譯,這種效率是很低的。

由於Android這幾年不斷的發展需要用兩個時間段來進行分析

第一階段

Android4.4及其以下的版本Dalvik虛擬機階段

為了更高效率的運行Java,Google等廠商合作開發了Android移動設備平台的核心組成部分之一Dalvik虛擬機,允許在有限的內存中同時運行多個虛擬機的實例,並且每一個Dalvik應用作為一個獨立的Linux進程執行,獨立的進程可以防止在虛擬機崩潰的時候所有程序都被關閉。

其實就是每一個應用都是作為獨自的虛擬機運行,與其他應用互不牽扯。

在程序運行的過程中,Dalvik虛擬機還是在不斷的進行將字節碼編譯成機器碼的工作。

目前在Android4.4及其以下的版本中,應該全都是使用的Dalvik這種模式。

Dalvik虛擬機需要額外的內存來做垃圾回收 (garbage collection). 也就是當一個 Android 應用結束運行之後, Java 需要額外內存來回收該應用占去的內存. 一般來說, 在內存充裕的系統上, 這個機制運行得還不錯. 一旦運行大批不同的應用, 問題就出現了. 以下表格顯示, 一個 Android 應用理論上使用一份內存, 但是事實上卻需要四份到八份的富餘給 Java 去做回收, 系統才能夠達到流暢. 開很多 Android 應用會卡卡卡, 就是這個原因.

第二階段

Android5.0及後續版本ART (Android Runtime)

Android Runtime(縮寫為 ART),是一種在Android作業系統上的運行環境,由Google公司研發,並在2013年作為Android 4.4系統中的一項測試功能正式對外發布,在Android 5.0及後續Android版本中作為正式的運行時庫取代了以往的Dalvik虛擬機。

ART能夠把應用程式的字節碼轉換為機器碼,是Android所使用的一種新的虛擬機。

它與Dalvik的主要不同在於:Dalvik採用的是JIT技術,而ART採用Ahead-of-time(AOT)技術。

ART同時也改善了性能、垃圾回收(Garbage Collection)、應用程式除錯以及性能分析。

在應用程式啟動時,JIT通過進行連續的性能分析來優化程序代碼的執行,在程序運行的過程中,Dalvik虛擬機在不斷的進行將字節碼編譯成機器碼的工作。

ART引入了AOT這種預編譯技術,在應用程式安裝的過程中,ART就已經將所有的字節碼重新編譯成了機器碼。

應用程式運行過程中無需進行實時的編譯工作,只需要進行直接調用.因此,ART極大的提高了應用程式的運行效率,同時也減少了手機的電量消耗,提高了移動設備的續航能力,在垃圾回收等機制上也有了較大的提升。

相對於Dalvik虛擬機模式,ART模式下Android應用程式的安裝需要消耗更多的時間,同時也會占用更大的儲存空間(指內部儲存,用於儲存編譯後的代碼),但節省了很多Dalvik虛擬機用於實時編譯的時間

由此看見Android5.0之後的性能提升不是一丟丟,隨著國內廠商適配手機系統進程的跟進,現在的新手機已經基本進入Android6.0時代了,再加上大內存的支持,曾經的卡頓現在已經得到了很好的改善。

在這裡還是要特彆強調Android陣營雖然做了諸多的改善,還是提倡大家購買新手機的時候一定要購買2G以上運存的手機,因為1G運存還是很吃力的。

其實Android還可以用c語言進行開發應用程式;

先看一下Android系統架構圖

大多數程序位於最上層的Java Application層。

Android通過把系統劃分為幾個層次從而使得開發者可以使用平台無關的Java語言進行Android應用開發,不必關心程序實際的硬體環境。

Google不僅為開發者提供了SDK開發套件,為了能讓開發者使用C/C++編寫的本地化的共享庫,利用編譯後的共享庫更高效的完成計算密集型的操作來提高應用的性能,或者移植重用已有的C/C++組件,提高開發效率,Android 1.5之後,又推出了NDK(Native Development Kit)。

有了NDK,開發者能夠在Android平台上使用JNI(Java Native Interface)技術,實現應用程式中調用本地二進位共享庫。

下面通過一個實驗對比這兩張語言的效率:在同一部系統為Android6.0的手機上分別用兩種語言把一張彩色圖片轉變為灰色圖片所用的時間來進行對比。

一種採用Java的方式,一種通過JNI技術調用C/C++的方式

原圖:




java處理後的圖片效果及所耗時間:

C/C++處理後的圖片效果及所耗時間:

為了實驗的精準性進行了10次測試,測試結果如下:

可以看到這在Android6.0ART模式下Java的消耗時間還是比C多10%,然而從這10%的差距中我們也看到了Android這幾年所做出的努力。

通過這期介紹Android在開發語言方面已經遜色於iOS了,往後幾期會從不同的角度客觀詳細的的分析這兩大系統,歡迎大家訂閱及時收看;


請為這篇文章評分?


相關文章