エスケープ分析と(ProGuardのような)静的なJavaバイトコードオプティマイザ?

StackOverflow https://stackoverflow.com/questions/3018058

質問

エスケープ解析に基づく最適化は、ProGuardのために計画された機能です。一方で、ProGuardのような既存のツールはすでにエスケープ分析を必要とする最適化を行うことがありますか?

役に立ちましたか?

解決

はい、私はすすフレームワークを行い、分析を免れると考えています。

他のヒント

あなたは、コンパイラレベルでエスケープ解析から何を期待していますか?例えば、あなたが通過コードの行を持つことになります(したがって、エスケープ分析は、唯一のシングルメソッドレベルで行わ限らユーザビリティのであるとデバッグを妨げるだろうことができ、それらはJVMにリンクされている - Javaクラスは、より多くのCのオブジェクトファイルのようなものですこれはあなたがステップすることはできません)。

Javaの設計では、コンパイラはかなりダムである - それは(リントなど)正しさをチェックしますが、最適化しようとしません。スマートピースはJVMに入れている - それは現在の条件の下で、現在のプラットフォーム上でコードを実行するだけでなく得るために、複数の最適化技術を使用しています。 JVMは、現在、それはコンパイラよりも多くの多くを取ることができるロードと仮定が無効化される瞬間を元に戻している投機的な最適化を実行されたすべてのコードを知っているので。 (コードが「熱い」を取得するように、例えばループの途中で)関数の実行中のHotSpot JVMは、オンザフライで、より最適化されたバージョンを使用してコードを置き換えることができます。

デバッガでは、非オーバーラップ寿命が崩壊しているとの変数は、不変条件をループの外掲揚されていない場合は、ループがアンロールされている、などすべてこれはJIT-テッドコードで起こるとに費やされているどのくらいの時間に依存して行われますこの機能(それが実行されることはありませんコードの最適化の時間を過ごすためにあまり意味がありません)。我々は先行これらの最適化の一部を実行した場合、JITはあまり自由を持つことになりますし、全体的な結果は正味の負のかもしれません。

別の最適化は、現在の方法をエスケープしないオブジェクトのスタック配分である - これは、特定の場合で行われ、私は最適化することによって得られる時間対厳格なエスケープ分析を実行するための時間が、それは価値はないことを示唆していることを紙のどこかを読んでいるがそれなので、現在の戦略は、より多くのヒューリスティックです。

全体的に、JVMがあなたの元のコードについて持っているより多くの情報は、より良い、それはそれを最適化することができます。そして、JVMが行う最適化は常にそれゆえ、私は携帯電話のような非常に制限され、基本的なのJVMについて話すときにのみコンパイルされたコードの最適化を考えるだろう、改善しています。これらのケースでは、(短縮クラス名などに。)とにかく難読化ツールを通して、あなたのアプリケーションを実行したい。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top