私は高性能のAndroidアプリケーション(ゲーム)に取り組んでおり、最初は読みやすさのためにコーディングしようとしていますが、内部で何が起こっているのかを心の奥底に留めておきたいと思っています。C ++を使用して、コンパイラーが私のために何をするか、何をしないかについて、かなり良い直感を身に付けました。私はJava/Androidでも同じことをしようとしています。
したがって、この質問。私はこのトピックについてウェブ上でほとんど見つけることができませんでした。Javaコンパイラ、Dalvikコンバータ(dx)、および/またはJITter(Android 2.2以降)は、次のような最適化を実行しますか?
メソッドのインライン化。どのような条件下で?
private
メソッドは常に安全にインライン化できます。これは行われますか?public final
メソッドはどうですか?他のクラスのオブジェクトのメソッド?static
メソッド?オブジェクトの実行時タイプがコンパイラーによって簡単に推測できる場合はどうなりますか?final
可能な限り、または可能な限りメソッドを宣言する必要がstatic
ありますか?一般的な部分式除去。たとえば、
someObject.someField
2回アクセスした場合、ルックアップは1回だけ実行されますか?ゲッターへの呼び出しの場合はどうなりますか?算術式を2回使用するとどうなりますか。一度だけ評価されますか?for
値が変更されないことがわかっている式の結果をループの上限として使用するとどうなりますか?配列ルックアップの境界チェック。
for
ツールチェーンは、典型的なループなどの特定の条件でこれを排除しますか?値のインライン化。一部へのアクセスは
public static final int
常にインライン化されますか?彼らが別のクラスにいるとしても?別のパッケージに入っていても?分岐予測。これもどれほど大きな問題ですか?ブランチングは、一般的なAndroidデバイスで大きなパフォーマンスヒットですか?
単純な算術。
someInt * 2
に置き換えられsomeInt << 1
ますか?
その他..。