2013-03-09 16 views
5

私はASMを使用していくつかのJavaバイトコード生成を行いました。
ビジターパターンである種の小さいDSLのASTの何らかの種類を歩くことによって。
そして、私は、生成されたバイトコードが「コンパイル時の最適化」なしでは、「直感的」であると心配しています。
私の場合は、生成されたバイトコードが最適化されていない場合でも問題ありませんが、実行時にバイトコードを生成するプロジェクトがバイトコード最適化を行う必要がありますか?
私は、jvmの場合、プログラムの実行中にjitコンパイルによってほとんどの「最適化」作業が行われることを知っています。したがって、コンパイル時のバイトコードの最適化はほとんど影響を与えません。
本当にですか?その場で生成されるバイトコードのバイトコード最適化を行うことは絶対に意味がありませんか?主に実行時パフォーマンスにおいて、最適化の有無にかかわらず、バイトコード間の違いについていくつかの経験を共有する人はいますか?動的に生成されるJavaバイトコードに最適化が必要ですか?

+0

例をハードコードし、バイトコードジェネレータと競合させてみてください。 –

+0

コードが頻繁に実行されない場合は、JITによって最適化されませんが、問題はありません非常に頻繁に実行されます。また、頻繁に実行されると最適化されます。誰もが幸せです。 – assylias

+0

このhttp://stackoverflow.com/a/1680212/655756をご覧ください。言い換えると、さらに最適化を行うことができますが、通常はそれらの最適化が「化粧」のように見えるため、必ずしも必要ではありません。 – n1ckolas

答えて

2

私は少なくとも1つのJVMベースの言語を知っていますが、名前のないまま残りますが、地獄のように遅いです。コンパイル時の最適化を使用していた可能性があります。

JavacとJVMはおおよそ同じプログラミングモデルを分析しているため、Javacが採用できる最適化手法はJVMでも使用できます。その後、Javacが作業を複製するにはあまり意味がありません。実際には、Javacができるだけ多くのソースコードの構造を残して、JVMがコードについてより良い理由を持つことができるようにするのがおそらく好ましいでしょう。

ソース言語がJava-ish言語でない場合は該当しません。

これについて考えると、CPUはすばらしい最適化もたくさん行っています。なぜJVMは最適化を行う必要がありますか?それをすべてCPUに任せてみてください。 CPUとJVMは非常に異なるコードを分析しているためです。 CPUは機械命令の任意のシーケンスを解析しています(ただし、高水準言語の一般的な動作に基づいて仮定を行うことができます)。 JVMは、非常に具体的ではるかに高いレベルの言語を分析しており、JVMは、CPUが機械命令から発見することはほとんど不可能な知識に基づいてコードを推論し、変換することができます。

あなたのケースに戻って、より高いレベルのソース言語についてもっとよく知っている(コンパイラとして)場合、JVMでは不可能な変換を実行することができます。

+0

すばらしい説明!私はあなたのポイントを理解していると思う、それは私が冷静になります。したがって、DSLがより高いプログラミングモデル、例えば「ルールエンジン」という形のブール論理を導入すると、「ゲートロジック最適化」のようなブール論理理論でいくつかの最適化を行うことができます。しかし、私のDSLがJavaのようにカプセル化された命令型プログラミング言語であれば、最適化を行う必要はありません。 –

0

いいえ不要です。

Javacの出力を見ると、コンパイル時の最適化はほとんどありません。 HotspotのJITのおかげで、バイトコードの変更による影響が最適化にどのような影響を及ぼすのかを知ることは困難です。実際のボトルネックがあることを証明して調査する時間がない限り、こうしたことを心配しないのが最善です。

関連する問題