ART:新的Android運行時庫
在2014年的Google I/O大會上,演講者Brian Carlstrom、Anwar Ghuloum和Ian Rogers(都來自于Google)討論了ART(Android RunTime的縮寫)。在下一代Android版本中,ART會取代Dalvik成為默認的平臺。(下一代Android版本,叫做Android L,已經有一個預覽版提供給開發人員下載了。Android L會在秋天的某一時間發布。)
Dalvik誕生于2000年代中期,那個時候移動設備的處理器速度相對較慢,內存也很有限。因此,Dalvik無法充分利用如今這些移動硬件,更快的CPU和GPU、更大的內存以及高分辨率屏幕。相反,新的ART平臺就是專了發揮多核架構和64位指令集的優勢而設計的。
Dalvik使用JIT編譯技術:這種方案使應用程序的部分指令在運行的時候得到轉換。JIT的優勢是,應用程序沒有運行的時候,它占用的內存相對較小。劣勢是一邊運行一邊轉換會使應用程序的性能變差。新的ART平臺犧牲了內存來換取性能,它用的是ahead-of-time(AOT)編譯技術。在ART中,一個應用程序的所有指令在運行前就編譯好了。
ART的另一個重大改進是垃圾回收算法。Dalvik的垃圾回收分為兩個階段。第一個階段,Dalvik暫停所有的線程來分析堆的使用情況。第二個階段,Dalvik暫停所有線程來清理堆。因此,Dalvik中一次典型的垃圾回收耗時約10毫秒——這已經足夠導致應用在性能上的“卡頓”(這里的術語“卡頓”指的是界面元素在屏幕上斷斷續續地移動。通常,糟糕的性能會導致應用在動畫上丟幀。丟幀是卡頓的重要原因。)
ART改進后的垃圾回收算法只暫停線程一次。典型的停頓時間從10毫秒降到了3毫秒。除此以外,ART的內存分配程序(稱為rosalloc)比Dalvik中的分配器更少使用鎖。這樣就減少了很多運行中由于分配內存導致的停頓。
跟Dalvik不一樣,ART支持64位處理器。Play Store上大約85%的應用程序本來就兼容64位,因為他們不含有任何的原生(NDK)代碼。
在很多場景下,支持64位的主要原因是越來越大的內存。對Android來說這不是個問題,因為市面上還沒有任何移動設備的內存超過4GB。但是當ART運行在64位模式下的時候,它會運用一些32位處理器上沒有的指令。這些64位的指令比它們對應的32位版本更快。
最重要的是在ART上運行的應用程序要比在Dalvik上運行快。快多少?在Google I/O大會的對話中,我看到這個數字從10%到300%都有。很多性能基準程序測試下來,快30%到80%比較常見。但是,在一場由Big Android BBQ(譯者注:一項為Android開發者、黑客舉辦的科技聚會,詳見官網)的人贊助的非正式聚會上,我看到他們同時在三臺設備上運行同一應用程序。在其他條件都相同的前提下,一臺設備跑Dalvik,第二臺跑32位的ART,第三臺跑64位的ART。在Dalvik的上,那個應用程序的性能簡直無法忍受。在32位的ART上,動畫變得流暢一些了,但還是有點“卡頓”,在64位的ART上,動畫相當流暢,任何物體的移動都感覺不到停頓。
參考原文鏈接:http://www.infoq.com/news/2014/07/art-runtime
來自:http://www.infoq.com/cn/news/2014/07/art-runtime