私は最近Cで多くのコードを書いており、現在Javaに切り替えています。私は現在大きなデータ構造を実装しており、gccのようなパフォーマンスを向上させるためにJavaコンパイラーを呼び出すときにオンにできる最適化フラグがあるかどうか疑問に思っていました。
私は慣れています:
gcc -O3 -NDEBUG MyProgram.c
javac
に類似したコマンドはありますか?
JDKを使用していて、Ubuntu 10.04を実行しています。
Javaの最適化は、ほとんどが実行時にJITコンパイラによって行われます。そのため、コンパイル時に特定の方法で最適化するように指示しようとしても意味がありません(とにかくバイトコードのみを作成している場合)。 JITは、正確な環境を把握し、コードの特定の部分の実行の実際のパターンを観察しながら、ほぼ確実にその場でより良い決定を下します。
パフォーマンスに影響を与える特定のコンパイラオプションがいくつかありますが、これらはコード自体を最適化するのではなく、JVM(ガベージコレクタを含む)をチューニングするためのものです。
-O3
や-O
レベルに相当するものはありませんが、-XX:
を介してアクセスできる特定のチューニングオプションがあります。利用可能な完全なリストがあります ここ 。
これは、Oracle提供のJVMを使用していることを前提としていますが、環境によって異なる場合があります(「JDKの使用」では、使用しているバージョンを実際に説明していません)。
Javaバイトコードは、人気のあるJava obfuscatorを介して Proguard を介して実行することで最適化できます。圧縮、最適化、難読化されます。ほとんどすべてを制御するスイッチをこの順序でコーディングします。これにより、未使用のメソッドと変数、インラインコードが削除され、デッドブランチが削除され、同一のコードがマージされ、他の何十もの最適化が実行されます。結果は、入力と同じように機能するjarファイルです。占有するスペースが少なく、実行速度が速くなります。
商用のクライアント側ソフトウェアにはなくてはならないものです。
ホットスポットVMが適切と思われるように、Javaコードの最適化が実行時に適用されます。(私の知る限り、これには、メソッド呼び出しカウントの追跡と頻繁に呼び出されるメソッドのネイティブコードへのコンパイルといくつかのタイプの試行が含まれます。最適化も同様です。)
javac
で使用できる唯一のリモート接続スイッチは_-g:none
_であり、これはコンパイラにデバッグ情報を省略するように指示します。これはコードのパフォーマンスに実際には影響しませんが、_.class
_ファイル。
VMを開始するときは、_-server
_オプションと_-client
_オプションのどちらかを選択できます。これは、最適化の範囲と、それらがどのくらい早く開始するかに影響します。
JVMとJITは、実行時にコードのほとんどの最適化を行うため、弾丸をかじって、基礎となるバイトコードマニピュレータ(JVMおよびJIT)を信頼して最適化を行う必要があります。