(プログラムネタ) JVMの最適化
2009年06月28日13:12
javaのassertは、C++などのコンパイラ言語にあるようなassertと違って、コンパイル時の指定によってクラスファイルから削除することができず、常にassert指令がコンパイル結果に残る。 つまり開発時専用のコードが本番時にも残ることになり、効率が悪いように感じる。
しかしそれは事実ではないらしい。 javaのクラスファイルは実行時JVMによってネイティブコードにコンパイルされるが、assertionをオフにして実行すると、この段階で assertion用のコードはばっさり削除されてコンパイルされるらしい。 つまりクラスファイルにassertionが残っていても実行効率が落ちることはない、ということらしい。
javaのクラスファイルコンパイラは最適化をほとんど度外視した非常にストレートな実装になっているけど、それはその後で処理を行うJVMが条件によってネイティブコードのコンパイル結果を最適化するようになっているかららしい。 JVMが 最適化するときのヒントを得るため、クラスファイルコンパイラはあまり情報を削除しないようになっているのだろう。
だから java には コンパイラ指令もないのだろう。 コンパイラ指令によって、特定のコードをインライン展開したり、削除したりしたくなるが、これらのコンパイルの最適化は、二回目のコンパイル=JVM によるネイティブへのコンパイル時にJVM によって自動的に行われる、というポリシーなのだろう。
javaは 二回コンパイルされる、ということは覚えておいて損はないと思う。
しかしそれは事実ではないらしい。 javaのクラスファイルは実行時JVMによってネイティブコードにコンパイルされるが、assertionをオフにして実行すると、この段階で assertion用のコードはばっさり削除されてコンパイルされるらしい。 つまりクラスファイルにassertionが残っていても実行効率が落ちることはない、ということらしい。
javaのクラスファイルコンパイラは最適化をほとんど度外視した非常にストレートな実装になっているけど、それはその後で処理を行うJVMが条件によってネイティブコードのコンパイル結果を最適化するようになっているかららしい。 JVMが 最適化するときのヒントを得るため、クラスファイルコンパイラはあまり情報を削除しないようになっているのだろう。
だから java には コンパイラ指令もないのだろう。 コンパイラ指令によって、特定のコードをインライン展開したり、削除したりしたくなるが、これらのコンパイルの最適化は、二回目のコンパイル=JVM によるネイティブへのコンパイル時にJVM によって自動的に行われる、というポリシーなのだろう。
javaは 二回コンパイルされる、ということは覚えておいて損はないと思う。
コメント一覧