私は高性能なAndroidアプリケーション(ゲーム)を開発していますが、最初に読みやすさをコード化しようとしていますが、私は心の中に何が起こっているのかを後で把握したいと思います。 C++では、私はコンパイラが私にとって何をしてくれないかについてかなり良い直感を築きました。私はJava/Androidでも同じことをしようとしています。DalvikとAndroidツールチェーンの最適化について教えてください。
したがって、この質問。私はこの話題についてウェブ上でほとんど見つけることができませんでした。 JavaコンパイラであるDalvikコンバータ(dx)やJITter(Android 2.2以降)は、次のような最適化を実行しますか?
メソッドインライン化。どのような条件の下で?
private
メソッドは常に安全にインライン化できます。これは行なわれるのだろうか?public final
の方法はどうですか?他のクラスのオブジェクトに関するメソッド?static
方法?オブジェクトの実行時の型がコンパイラによって簡単に導き出される場合はどうでしょうか?可能であれば、メソッドをfinal
またはstatic
と宣言する必要がありますか?共通部分式消去。たとえば、
someObject.someField
に2回アクセスすると、検索は1回だけ行われますか?それがゲッターへの呼び出しの場合はどうなりますか?何度か算術式を2回使用するとどうなりますか?それは一度だけ評価されますか?値を変更しないとわかっている式の結果を、ループの上限として使用するとどうなりますか?境界の検索を確認します。ツールチェーンは、特定の条件(ループの典型的な
for
ループのような)でこれを排除しますか?値インライン化。
public static final int
へのアクセスは常にインライン化されますか?たとえ彼らが別のクラスにいても?彼らが別のパッケージに入っていても?分岐予測。この問題はどれくらい大きな問題ですか?典型的なAndroid搭載デバイスでは、ブランチングのパフォーマンスが低下しますか?
単純な算術。は、
someInt << 1
に置き換えられますか?someInt * 2
はsomeInt << 1
に置き換えられますか?
エトセトラ...
これは役に立つかもしれません:http://developer.android.com/guide/practices/design/performance.html – pablochan
これらは便利かもしれません:http://www.netmite.com/android/mydroid/dalvik/ docs/dexopt.html、http://www.taranfx.com/android-internals-jit-froyo、およびプレゼンテーションのpdfバージョン:http://www.android-app-developer.co.uk/android- app-development-docs/android-jit-compiler-androids-dalvik-vm.pdf – Lior
@pablochan:私の枕の下にいたのですが、感謝します:) @Lior:良い参考書、 ! – Thomas