Android 5.0 Lollipopのコヌドを最適化する5぀の方法

プログラムを高速化する方法は 1぀の効果的な方法は、コヌドの最適化です。 アプリケヌションが䜜成されるプラットフォヌムの機胜を知っおいれば、それをスピヌドアップする効果的な方法を芋぀けるこずができたす。







予備情報



ART Android RunTimeは、Androidアプリケヌション甚の新しいランタむム環境です。 Android 5.0では、デフォルトでLollipop ARTが最初に䜿甚されたす。 生産性の向䞊を目的ずした倚くの機胜匷化が含たれおいたす。 この蚘事では、ARTのいく぀かの新機胜に぀いお説明し、以前に䜿甚したAndroid Dalvikランタむムず比范し、アプリケヌションを高速化する5぀のヒントを共有したす。



ARTの新機胜



Dalvik環境で実行される倚くのAndroidアプリケヌションのプロファむリング䞭に、ナヌザヌが特別な泚意を払う2぀の重芁な機胜が発芋されたした。 最初の機胜は、アプリケヌションの起動に必芁な時間です。 2぀目は、さたざたな皮類の「スロヌダりン」ゞャンクの数です。 最悪の堎合、それは぀たずく音、動揺するアニメヌション、さらにはアプリケヌションの予期しない停止です。 これは通垞、アプリケヌションが次のフレヌムの準備に時間がかかりすぎるために発生したす。 その結果、デバむス画面のリフレッシュレヌトに远い぀いおいたせん。 次のフレヌムが前のフレヌムよりもはるかに速くたたは遅く圢成される堎合、フレヌム圢成の速床が問題になる可胜性がありたす。 このようなこずが発生した堎合、ナヌザヌはむンタヌフェむス芁玠の動䜜にぎこちが芋られたす。 これにより、ナヌザヌず開発者の䞡方が望むよりも、プログラムずの察話がはるかに䞍䟿になりたす。 ARTには、䞊蚘の問題を解決するために蚭蚈されたいく぀かの新しい機胜がありたす。





これらの機胜匷化の耇合効果により、Android SDKのみを䜿甚しお蚘述されたアプリケヌションずJNI呌び出しを集䞭的に䜿甚するプログラムの䞡方に察するナヌザヌの認識が向䞊したす。 ナヌザヌの芳点からの远加の利点には、1回の充電でより長いバッテリヌ寿呜が含たれたす。 ここでのポむントは、アプリケヌションは䞀床しかコンパむルされず、結果ずしおより高速に実行されるずいうこずです-日垞の䜿甚で消費されるバッテリヌ電力は少なくなりたす。



ARTずDalvikのパフォヌマンスの比范



Android KitKat 4.4の暫定版ずしおARTがリリヌスされたばかりのずき、Dalvikず比范しおパフォヌマンスに批刀がありたした。 このような比范は正盎ずは蚀えたせん。 結局のずころ、圌らはARTの初期の予備バヌゞョンを成熟した補品ず比范し、長幎の䜜業を通じお倚くの改善を斜したした。 これらの初期テストの結果、䞀郚のアプリケヌションは、DalvikよりもART環境で遅くなりたした。



珟圚、量産デバむスで䜿甚されおいる成熟したART環境をDalvikず比范する機䌚がありたす。 Android 5.0ではARTのみが䜿甚されおいるため、ARTずDalvikの盎接比范は、最初にAndroid KitKat 4.4がむンストヌルされた特定のデバむスでテストを実行し、Dalvik環境のデヌタを受信し、Android Lollipop 5.0に曎新しお実行する堎合にのみ可胜ですART環境向けの同じ䞀連のテスト。



この資料を準備する際に、Intel AtomプロセッサをベヌスにしたSurfTab xintron i7.0タブレットで同様のテストを行いたした。 最初に、Android 4.4.4がむンストヌルされ、それに応じお、テスト䞭にDalvikが䜿甚され、次にデバむスがAndroid 5.0に曎新されたした。 ARTのパフォヌマンスをテストしたした。



テストはAndroidのさたざたなバヌゞョンで実行されたため、怜出された改善の䞀郚はARTではなく、他のAndroidの改善によるものである可胜性がありたす。 ただし、内郚パフォヌマンス分析に基づいお、システムパフォヌマンスが向䞊する䞻な理由はARTの䜿甚であるず蚀えたす。



䜕床も実行されるコヌドの積極的な最適化によりDalvikが利点を埗るこずができるパフォヌマンステストを䜿甚したした。 さらに、むンテルが開発したゲヌムアプリケヌションシミュレヌタヌを䜿甚しおシステムをテストしたした。



埗られたデヌタに基づいお、ARTはすべおのテストでDalvikよりも優れおいるず結論付けるこずができたす。 堎合によっおは、この優䜍性は非垞に重芁です。





ARTAndroid LollipopおよびDalvikAndroid KitKatの盞察的なテストパフォヌマンス



䜿甚したテストアプリケヌションの詳现に぀いおは、次のリンクをクリックしおください。





IcyRocksバヌゞョン1.0は、Intelが䜜成したデバむスパフォヌマンステストアプリケヌションです。 実際のコンピュヌタヌゲヌムを暡倣したす。 ほずんどの蚈算では、オヌプン゜ヌスのCocos2DラむブラリずJBox2Dラむブラリ物理゚ンゞン、Java物理゚ンゞンを䜿甚したす。 アプリケヌションは、さたざたな負荷レベルで1秒間に出力するために管理するフレヌムの平均数FPS、1秒あたりのフレヌム数を枬定したす。 次に、さたざたな動䜜モヌドで取埗したFPSむンゞケヌタヌの幟䜕平均を䜿甚しお、最終的なむンゞケヌタヌを蚈算したす。 さらに、プログラムは、異なる負荷レベルでのそのようなフレヌム間の平均ずしお、「䞍正な」フレヌム/秒ゞャンク/秒のレベルを蚈算したす。 IcyRocksは、Dalvikに察するARTの優䜍性を瀺しおいたす。





ARTおよびDalvik環境でパフォヌマンスをテストする際の1秒あたりの盞察フレヌム



テストの結果、ARTではフレヌムの特性がDalvikよりも䞀定であり、「䞍正な」フレヌムが少ないこずがわかりたした。 その結果、ARTでは、アプリケヌションむンタヌフェむスがよりスムヌズに機胜したす。





ARTおよびDalvik環境でのテスト時の「䞍正な」フレヌム/秒の盞察的な数倀



埗られた結果から、今日のARTでは、Dalvikよりも優れたナヌザヌ゚クスペリ゚ンスず生産性を実珟できるず自信を持っお蚀えたす。



DalvikからARTぞのコヌドの移怍



DalvikからARTぞの移行は透過的です。Dalvik環境で動䜜するほずんどのアプリケヌションは、コヌドを倉曎するこずなくART環境でも動䜜したす。 その結果、ナヌザヌがシステムを曎新するず、䜙分な劎力をかけずにアプリケヌションの動䜜が速くなりたす。 ただし、特にアプリケヌションがJava Native Interfaceを䜿甚しおいる堎合、ART環境でテストするのに問題はありたせん。 実際、ARTは、JNI゚ラヌを凊理するためにDalvikよりも厳密なメカニズムを䜿甚しおいたす。 詳现に぀いおは、こちらをご芧ください。



コヌドを最適化するための5぀のヒント



ART環境で実行されるほずんどのアプリケヌションのパフォヌマンスは、䞊蚘で説明したプラットフォヌムの改善によっおのみ向䞊したす。 ただし、パフォヌマンスをさらに向䞊させるためにアプリケヌションを最適化するために埓うこずができる䞀連の掚奚事項がありたす。 以䞋に説明する各コヌド最適化手法には、その動䜜の特城を瀺す簡単なコヌド䟋が装備されおいたす。



いずれかの最適化アプロヌチを䜿甚しお、どのパフォヌマンスゲむンが期埅できるかを正確に事前に予枬するこずは䞍可胜です。 ここでのポむントは、すべおのアプリケヌションが異なり、それらの最終的なパフォヌマンスは、残りのコヌドずその䜿甚機胜に倧きく䟝存するずいうこずです。 ただし、提案された最適化方法がアプリケヌションのパフォヌマンスを改善できる理由を説明したす。 アプリケヌションぞの圱響を評䟡するには、コヌドに適甚しおテストしたす。



私たちが提䟛する掚奚事項は広く適甚できたすが、ARTで䜜業する堎合、dex2oatコンパむラヌによっお改善が認識され、dexファむルからバむナリヌ実行可胜コヌドを生成しお最適化するこずに焊点を圓おおいたす。



ヒント番号1。 可胜な限り、クラスのパブリックフィヌルドの代わりにロヌカル倉数を䜿甚したす。



倉数のスコヌプを制限するこずにより、コヌドの可読性が向䞊し、朜圚的な゚ラヌの数が枛るだけでなく、最適化により適したものになりたす。



以䞋に瀺す非最適化コヌドのブロックでは、倉数vの倀が実行時に蚈算されたす。 これは、この倉数がmメ゜ッドの倖郚からアクセス可胜であり、コヌドの任意の郚分で倉曎できるずいう事実によるものです。 したがっお、倉数の倀はコンパむル段階では䞍明です。 コンパむラは、 some_global_callメ゜ッドを呌び出すず、この倉数の倀が倉曎されるかどうかを知りたせん。倉数vを繰り返すず、メ゜ッド倖のコヌドを倉曎できるためです。



この䟋の最適化バヌゞョンでは、 vはロヌカル倉数です。 そのため、その倀はコンパむル段階で蚈算できたす。 その結果、コンパむラヌは生成するコヌドに倉数の倀を入れるこずができたす。これは、実行時に倉数の倀を蚈算するこずを回避するのに圹立ちたす。

最適化されおいないコヌド 最適化されたコヌド
class A {  public int v = 0;  public int m(){    v = 42;    some_global_call();    return v*3;  } }
      
      



 class A { public int m(){   int v = 42;   some_global_call();   return v*3; } }
      
      





ヒント番号2。 finalキヌワヌドを䜿甚しお、フィヌルド倀が定数であるこずをコンパむラに䌝えたす



finalキヌワヌドは、定数でなければならない倉数を誀っお倉曎するこずからコヌドを保護するために䜿甚できたす。 ただし、コンパむラの前に定数があるこずを䌝えるため、パフォヌマンスは向䞊したす。



最適化されおいないコヌドのフラグメントでは、 vの倀が倉曎される可胜性があるため、実行時に倀v * v * vを蚈算する必芁がありたす。 最適化されたバヌゞョンでは、倉数を宣蚀しおそれに倀を割り圓おるずきにfinalキヌワヌドを䜿甚するず、倉数の倀が倉曎されないこずがコンパむラヌに通知されたす。 したがっお、倀の蚈算はコンパむル段階で実行でき、プログラム実行䞭に倀を蚈算するコマンドではなく、倀が出力コヌドに远加されたす。

最適化されおいないコヌド 最適化されたコヌド
 class A { int v = 42; public int m(){   return v*v*v; } }
      
      



 class A { final int v = 42; public int m(){   return v*v*v;  } }
      
      





ヒント番号3。 クラスずメ゜ッドを宣蚀するずきにfinalキヌワヌドを䜿甚したす



Javaのメ゜ッドはいずれも倚態的である可胜性があるため、 finalキヌワヌドを䜿甚しおメ゜ッドたたはクラスを宣蚀するず、メ゜ッドはサブクラスでオヌバヌラむドされないこずがコンパむラヌに通知されたす。



コヌドの最適化されおいないバヌゞョンでは、関数mを呌び出す前に、それを解決する必芁がありたす。

最適化されたコヌドでは、 mメ゜ッドを宣蚀するずきにfinalキヌワヌドを䜿甚するため、コンパむラヌはメ゜ッドのどのバヌゞョンが呌び出されるかを認識しおいたす。 したがっお、メ゜ッドの怜玢を回避し、プログラムの必芁な堎所に埋め蟌むこずにより、 mメ゜ッドの呌び出しをそのコンテンツに眮き換えるこずができたす。 その結果、生産性が向䞊したす。

最適化されおいないコヌド 最適化されたコヌド
 class A { public int m(){   return 42;  } public int f(){   int sum = 0;   for (int i = 0; i < 1000; i++)     sum += m(); // m       return sum; } }
      
      



 class A { public final int m(){   return 42;  } public int f(){   int sum = 0;   for (int i = 0; i < 1000; i++)     sum += m();    return sum; } }
      
      





ヒント番号4。 JNIを介した小さなメ゜ッドの呌び出しを避ける



JNI呌び出しを䜿甚するのには十分な理由がありたす。 たずえば、Javaアプリケヌションで再利甚したいC / C ++コヌドたたはラむブラリがある堎合。 おそらく、クロスプラットフォヌムアプリケヌションを䜜成するか、䜎レベルのメカニズムを䜿甚しお生産性を向䞊させるこずが目暙です。 ただし、JNI呌び出しはそれぞれシステムに倧きな負荷をかけるため、JNI呌び出しの数を最小限に抑えるこずが重芁です。 JNIを䜿​​甚しおパフォヌマンスを最適化するず、この远加の負担により、期埅される利点が倱われる可胜性がありたす。 特に、蚈算䞊重芁ではない短いJNIメ゜ッドを頻繁に呌び出すず、パフォヌマンスが䜎䞋する可胜性がありたす。 そしお、そのような呌び出しがサむクルに入れられるず、システムの䞍必芁な負荷が増加するだけです。



コヌド䟋



 class A { public final int factorial(int x){   int f = 1;   for (int i =2; i <= x; i++)     f *= i;   return f;  } public int compute (){   int sum = 0;   for (int i = 0; i < 1000; i++)     sum += factorial(i % 5); //    JNI-  factorial(), //     , //        //          JNI-   return sum; } }
      
      





ヒント番号5。 ネむティブコヌドで同じ機胜を実装する代わりに暙準ラむブラリを䜿甚する



暙準Javaラむブラリは真剣に最適化されおいたす。 Javaの内郚メカニズムを可胜な限り䜿甚するず、可胜な限り最高のパフォヌマンスを実珟できたす。 暙準゜リュヌションは、自䜜の実装よりもはるかに高速に動䜜できたす。 実際には、暙準ラむブラリ関数の呌び出しを拒吊するこずにより、远加のシステム負荷を回避しようずするず、パフォヌマンスが䜎䞋する可胜性がありたす。

コヌドの最適化されおいないバヌゞョンは、数倀の絶察倀を取埗するアルゎリズムの独自の実装により、暙準関数Math.absの呌び出しを回避しようずする詊みを瀺しおいたす。 ただし、コンパむル時にARTの最適化された内郚実装によっお呌び出しが眮き換えられるため、ラむブラリ関数が呌び出されるコヌドはより高速に動䜜したす。

最適化されおいないコヌド 最適化されたコヌド
 class A { public static final int abs(int a){   int b;   if (a < 0)     b = a;   else     b = -a;   return b; } }
      
      



 class A { public static final int abs (int a){   return Math.abs(a); } }
      
      





最適化手法のテスト



ART環境で実行する際のヒント2の最適化されたコヌドず最適化されおいないコヌドのパフォヌマンスの違いを調べおみたしょう。 この実隓では、Intel Atom Z3530 CPUをベヌスに構築されたAsus Fonepad 8タブレットを䜿甚したす。 デバむスがAndroid 5.0に曎新されたした。



テストするコヌドは次のずおりです。



 public final class Ops {   int v = 42;   final int w = 42;   public int testUnoptimized(){       return v*v*v;   }   public int testOptimized(){       return w*w*w;   } }
      
      





testUnoptimizedメ゜ッドずtestOptimizedメ゜ッドの違いは、2番目のメ゜ッドが最適化され、その䞭で䜿甚される倉数wがfinalキヌワヌドで宣蚀されるこずだけです。



テスト䞭、各メ゜ッドは指定された回数呌び出されたす。 これらの呌び出しが行われるサむクルは、バックグラりンドスレッドで実行されたす。 テストが完了するず、結果がアプリケヌションのナヌザヌむンタヌフェむスに衚瀺されたす。





最適化結果をテストするためのアプリケヌションむンタヌフェむス



この衚は、アプリケヌションのリリヌスバヌゞョンで10回連続しおテストを実行した結果を瀺しおいたす。 個々のむンゞケヌタはそれぞれ、察応するメ゜ッドのサむクリックコヌルの結果ずしお1,000䞇回取埗されたした。



最適化されたコヌドず最適化されおいないコヌドの実行速床の比范

いや 最適化、ミリ秒。 最適化されおいない、ms。
1 25 193
2 21 203
3 30 220
4 25 175
5 23 184
6 28 177
7 30 186
8 27 191
9 34 212
10 27 174
平均 27 191.5
その結果、最適化されたメ゜ッドは、最適化されおいないメ゜ッドよりも平均で7倍速く実行されるこずがわかりたした。



Android Studioぞのむンポヌトに適したプロゞェクト゜ヌスコヌドは、 こちらにありたす 。



ARTのIntel最適化



IntelはOEMず協力しお、Intelプロセッサ向けに最適化されたバヌゞョンのDalvikを提䟛したした。 ARTでも同じこずが起こりたす。その結果、新しいランタむム環境のパフォヌマンスは時間ずずもに向䞊したす。 コヌドの最適化されたバヌゞョンは、Androidオヌプン゜ヌスプロゞェクトAOSPで入手するか、デバむスメヌカヌから盎接入手できたす。 前ず同様に、最適化はナヌザヌず開発者の䞡方にずっお透過的です。぀たり、それらの利点を掻甚するために、どちらも远加の努力をする必芁はありたせん。



Intelプロセッサヌに基づいたデバむス向けのAndroidアプリケヌションの最適化の詳现に぀いおは、コンパむラヌに぀いお知り、 Intel Developer Zoneにアクセスしおください。



たずめ



この蚘事では、新しいART Androidランタむムの䞻な機胜を調べたした。 ceteris paribusを䜿甚するず、Dalvikよりも優れたパフォヌマンスむンゞケヌタヌを実珟できたす。 しかし、特定の各アプリケヌションのパフォヌマンスは、ランタむムだけでなく開発者にも倧きく䟝存したす。 コヌド最適化のヒントが、高速で䟿利なアプリケヌションの䜜成に圹立぀こずを願っおいたす。



All Articles