ASM を使用して Java バイト コードを生成しました。
訪問者パターンのある種の小さな DSL のある種の AST をたどることによって。
そして、生成されたバイトコードが「単純」すぎる、つまり「コンパイル時の最適化」が行われていないことを心配しています。
私の場合、生成されたバイト コードが最適化されていなくても問題ありませんが、実行時にバイト コードを生成するプロジェクトでバイトコードの最適化を行う必要はありますか?
jvmの場合、ほとんどの「最適化」作業は、プログラムの実行中にjitコンパイルによって行われるという事実を知っています。したがって、コンパイル時のバイトコードの最適化はほとんど影響しない可能性があります。
しかし、本当に?オンザフライで生成されたバイトコードに対してバイトコード最適化を行うことはまったく無意味ですか? 主に実行時パフォーマンスの違いについて、最適化の有無にかかわらずバイトコード間の違いについて経験を共有する人はいますか?
2 に答える
私は、少なくとも 1 つの JVM ベースの言語が名前のないままであることを知っていますが、それは地獄のように遅いです。コンパイル時の最適化を使用できた可能性があります。
Javac と JVM はほぼ同じプログラミング モデルを分析しているため、Javac で使用できる最適化手法はすべて JVM でも使用できます。その場合、Javac が作業を複製する意味はあまりありません。実際には、Javac がソース コードのできるだけ多くの構造を残して、JVM がコードについてより適切に判断できるようにすることをお勧めします。
ソース言語が Java っぽい言語でない場合、これは当てはまりません。
これについて考えてみてください。CPU も多くの優れた最適化を行っているのに、なぜ JVM が最適化を行う必要があるのでしょうか? すべてをCPUに任せてみませんか。CPU と JVM は非常に異なるコードを分析しているためです。CPU は任意の一連の機械語命令を分析しています (ただし、高級言語の一般的な動作に基づいて推測することはできます)。JVM は非常に具体的で、はるかに高水準の言語を分析します。JVM は、CPU がマシン命令から発見することはほとんど不可能な知識に基づいてコードを推論し、変換することができます。
あなたのケースに戻ると、(コンパイラとして) さらに高レベルのソース言語についてよく知っている可能性があり、JVM では不可能な変換を実行できます。
いいえ、必要ありません。
Javac の出力を見ると、コンパイル時の最適化は事実上まったく行われていません。また、Hotspot の JIT のおかげで、バイトコードの変更が最適化にどのような影響を与えるかを判断することは困難です。実際にボトルネックがあることを証明でき、それを調査する時間がない限り、そのようなことについて心配しないことをお勧めします。