プロファイルに基づく最適化にはいくつかの注意点があります。そのうちの1つは、リンクしたWikiの記事でも言及されています。結果は有効です
- 与えられたサンプルについて、ユーザーまたは他のコードが実際にコードをどのように使用しているかを表します。
- 特定のプラットフォーム(CPU、メモリ+その他のハードウェア、OSなど)。
パフォーマンスの観点からは、通常(多かれ少なかれ)同じと見なされるプラットフォーム間でもかなり大きな違いがあります(たとえば、シングルコア、512Mの古いAthlonと8Gの6コアIntel、Linuxで実行されているが非常に異なるカーネルバージョン)。
- 指定されたJVMとその構成に対して。
これらのいずれかが変更された場合、プロファイリング結果(およびそれらに基づく最適化)はもはや有効である必要はありません。ほとんどの場合、最適化のいくつかは依然として有益な効果をもたらしますが、それらのいくつかは最適ではない(またはパフォーマンスを低下させる)ことが判明する可能性があります。
前述のように、JIT JVMはプロファイリングと非常によく似た処理を実行しますが、その場で実行します。実行されたコードを常に監視し、頻繁に実行されるホットスポットを探し、それらの部分のみを最適化しようとするため、「ホットスポット」とも呼ばれます。この時点で、コードに関するより多くの知識(コードのコンテキスト、他のクラスでの使用方法など)を活用できるようになるため、あなたや他の回答で述べられているように、より良い最適化を行うことができます。静的なもの。監視を継続し、必要に応じて後で最適化を実行しますが、今回はさらに困難になります(より多くのより高価な最適化を探します)。
実際のデータ(使用統計+プラットフォーム+構成)で作業することで、前述の警告を回避できます。
その価格は、「プロファイリング」+JIT-ingに費やす必要のある追加の時間です。ほとんどの場合、それは非常によく過ごしました。
プロファイルガイド付きオプティマイザーは、それでも競合する(または打ち負かす)ことができると思いますが、警告を回避できる場合は、一部の特別な場合に限ります。
- サンプルが実際のシナリオを適切に表しており、実行中にあまり変化しないことは間違いありません。
- ターゲットプラットフォームを非常に正確に把握しており、そのプラットフォームでプロファイリングを実行できます。
- もちろん、JVMとその構成を知っている/制御している。
それはめったに起こらないでしょう、そして私は一般的にJITがあなたにより良い結果を与えると思います、しかし私はそれの証拠を持っていません。
JIT最適化を実行できないJVMをターゲットにしている場合、プロファイルに基づく最適化から価値を得るもう1つの可能性(ほとんどの小型デバイスにはそのようなJVMがあると思います)。
ところで、他の回答で言及されている1つの欠点は、回避するのが非常に簡単です。静的/プロファイルガイド付き最適化が遅い場合(おそらくそうです)、リリース(またはテスターに行くRC)またはナイトリービルド(時間がかかる場合)に対してのみ実行してくださいそれほど重要ではありません)。
はるかに大きな問題は、優れたサンプルテストケースを用意することだと思います。それらの作成と保守は通常簡単ではなく、多くの時間がかかります。特に、それらを自動的に実行できるようにしたい場合は、この場合は非常に重要です。