2011-01-27 11 views
6

アンドロイドデバイスの開発ゲームは、JITをまったく持たないデバイスをターゲットにし、バイトコードの最適化のみに依存する必要があります。これらの最適化のセットが空であるかどうかは疑問です...Javaの最適化:bytecode-only対JIT

実際には、Javaコンパイラ(JITではなく、ハードなjavac)は、/ 4を>> 2に変換するような最適化を行いますか?または、すべての最適化がJITの仕事ですか?

+0

左シフトは、プログラム全体の速度に影響しません。ほんの少しではない。 – delnan

答えて

7

標準のJavaコンパイラでは、,の最適化が行われますが、そのほとんどはJITに残ります。

JITは、プログラムが実行されているプロセッサを正確に把握しており、ランタイム情報にもアクセスできるため、Javaコンパイラよりも多くの最適化を実行できます。また、あらかじめ大幅な最適化を行うことで、バイトコードがやや乱雑になり、JITが最適化するのが難しくなります。

JavaバイトコードをDalvikコードに変換するときにGoogleのコンパイラが何をするのかわかりません。これは、より広範な最適化を行っている可能性があります。

たぶん、このツールはあなたのために有用であろう:Dalvik Optimization and Verification With dexopt

ところで、あなたが言及する例は必ずしも有効ではありません。 a/4a >> 2に変換しても、どのプロセッサでもプログラムを高速に実行できるとは限りません。私は現代のx86プロセッサーでa >> 2a/4よりも遅いかもしれないと説明していました(申し訳ありませんが、現時点では見つかりません...)。

いずれにしても、パフォーマンス測定の結果から価値のある証拠がない限り、a/4a >> 2に変換するような早すぎる最適化をソースコードに手作業で行わないでください。

+0

ありがとうございました。私は実際にマイクロ最適化を行っていませんが、わかりやすい読者が好きですが、JITのないデバイスがあらゆる可能な罪に苦しんでいるのか、コンパイラによって簡単な最適化が行われたのか不思議でした。あなたが言及したように、私の例はそれほど簡単ではありません...悪いものでした。 –

2

あなたの実行プラットフォームが実際にバイトコードを実行している場合、a/4などの直感はa >> 2より速いと思われます。あなたは把握してプロファイリングいくつかの深刻なアプリケーションを実行する必要があります。

  • それは価値が全く最適化、
  • あなたの努力を集中すること、及び(マイクロ)最適化は実際に動作するもの
  • であるかどうか。

FWIWでは、javacコンパイラは算術をマイクロ最適化しようとしません。最適なネイティブコードは、実際の実行プラットフォームのハードウェアによって異なります。javacがバイトコードを最適化しようとすると、JITコンパイラのタスクが難しくなる可能性があります。

関連する問題