この記事を読むのに必要な時間:およそ 1.5 分
5月19日~20日で開催された「Google I/O」の二日目の基調講演で,Android 2.2が披露されました。エンタープライズ機能の強化やChromeにJavaScriptエンジンV8の採用など,期待できるトピックが多くありましたが,一番の注目は「実行速度」です。Googleの発表によると,Android 2.1比で,2倍から5倍も高速に動作するとしています。1.5倍程度であれば,体感的に少し速くなった程度ですが,最大で5倍にもなれば,速くなったと確実体感できるはずです。
今回は,その「速さ」に迫ります。
Android.comでは、ビデオでAndroid 2.2の特徴を知ることができる。しかし、緑のFroyoは気持ち悪くて食べられませんね(笑)

Dalvik仮想マシンとは?
まずは,速さを司るDalvik仮想マシンについてご説明します。
Android OSには,Dalvik名付けられた仮想マシンが搭載されています。この仮想マシンは,CPUや記録装置などのハードリソースを仮想化し差異を吸収する役割があり,アプリをハードウェアから切り離すことが可能になります。
ハードリソースが限られた携帯端末で,どうして仮想マシンのような仕組みを使うかといえば,1つは先で書いたように,ハードウェアのアーキテクチャ変更に対する備えが考えられます。もう一つは,アプリの開発者が,ハードウェアのアーキテクチャを意識することなくアプリを開発することが可能になるためです。たとえば,ハードがCPU違っても,CPUごとにアプリを用意する必要はありません。
余談ですが,AppleがiPhone OS 4.0 SDKのリリースに合わせて,規約を変更し「Flash潰し」と話題になりましたが,近い将来,ハードウェアのアーキテクチャ変更を控えており,アプリの互換性を保つためではないか?という話があります。iPhoneは,Dalvik仮想マシンのような仕組みを持っていないので,ハードウェアのアーキテクチャを変更しようとすると,ユーザのみならず開発側にも混乱が発生します。Androidの場合,Dalvik仮想マシンのおかげで,こうした混乱は最小限になるはずです。
さて,Dalvik仮想マシンをJava仮想マシンと紹介することがあります。これは,開発言語にJavaが使われているためだと思われますが,Dalvik仮想マシンは,独自のJava実行環境です。
独自の実行環境を使う理由は,Javaで開発されたアプリの実行を高速するためで,その仕組みとして,独自のDalvik仮想マシンと専用の中間言語形式が用いられています。この中間言語形式は,Google社によると,同じソース・コードをコンパイルしたJavaのバイトコードよりも,50%程度減少し,圧縮形式のJavaバイトコードよりも小さいとしています。
5倍速い秘密とは?
のっけから結論になりますが,Android 2.2でアプリの実行速度が高速になった理由は,Dalvik仮想マシンに追加されたJust-in-time(JIT)コンパイラの存在です。これのおかげで,CPUへの負荷が大きい処理が,同じハードウェアのAndroid 2.1と比較して,2倍から5倍も高速に動作するとしています。
Java言語は,C/C++言語などの事前コンパイル言語とは異なり,コンパイラが中間言語に変換して,それを仮想マシンが解釈して実行するインタプリター型です。この方法では,プログラムの実行時間よりも,仮想マシンが中間言語を解釈に多くの時間が取られ,最善のパフォーマンスが得られないとされています。
先でDalvik仮想マシンは,専用の中間言語を用意して,Javaアプリを高速化しているとご説明しましたが,残念ながら事前コンパイルのような実行速度は得られません。そこで,アプリ実行時に中間言語を実行速度が稼げる機械言語に変換して,アプリ実行速度を向上させようというのがJITコンパイラで,5倍の速度が出る秘密はここにあります。
そのJITコンパイラには,中間言語を実行前に機械語に変換する「メソッドベース JIT」と仮想マシンで中間言語を実行しながらプロファイリングを行い,頻繁に繰り返し実行される部分を検出すると,その部分を機械語に変換する「トレースベースJIT」があり,Android 2.2のDalvik仮想マシンでは「トレースベースJIT」が使われています。
トレースベースJITが採用された理由は,中間言語から機械言語に変換するために掛かる余分なメモリが低く抑えられるためとしています。
これが本来の姿だ!
Android OSがリリースがされた当初から,Dalvik仮想マシンにJITコンパイラがないのは,単に間に合わなかっただけでは?と話される程,Javaを使う環境では,JITコンパイラは一般的な技術です。それが,Android 2.2で追加されたことで,ようやく本来の姿になり,本領が発揮できるようになったと言っても過言ではありません。これまでのAndroid端末の応答速度に不満を感じ「まだまだ」と評価した方がいたら,再評価する機会を設けてみてはいかがでしょうか?