私のプログラムの後の非デバッグバージョンから簡単に削除できるトラブルシューティングコードを書きたいと思います。私は思いついた:最終的な変数を持つステートメントについてJavaがどのくらいスマートであるか
デバッグ== falseの場合、最終的なバイトコードからif文を削除するにはスマートなJavaスマートフォンですか?
最終バージョンのプログラムからデバッグコードを削除するという目標を達成する方が良いでしょうか?
私のプログラムの後の非デバッグバージョンから簡単に削除できるトラブルシューティングコードを書きたいと思います。私は思いついた:最終的な変数を持つステートメントについてJavaがどのくらいスマートであるか
デバッグ== falseの場合、最終的なバイトコードからif文を削除するにはスマートなJavaスマートフォンですか?
最終バージョンのプログラムからデバッグコードを削除するという目標を達成する方が良いでしょうか?
はif(false)
の説明についてはJava language specification chapter 14.21. Unreachable Statementsの最後を参照してください:
if (false) { x=3; }
は、コンパイル時エラーにはなりません。最適化コンパイラは、ステートメント
x=3;
が、ここで指定された技術的 意味での「到達不能」と見なされていません 文x=3;
が実行されることはありませんことを実現することができると生成されたクラスファイルからその文のコードを省略する を選ぶかもしれませんが、 。if (DEBUG) { x=3; }
アイデアはそれということである:よう
static final boolean DEBUG = false;
して、コードを書く:この異なる治療のための理論的根拠
は にプログラマのような「フラグ変数」を定義できるようにすることですDEBUG の値をfalseからtrueに、またはtrueからfalseに変更してから、コード を正しくコンパイルして、プログラムテキストを変更する必要があります。
tl; dr;バイトコード内でif内部の文が省略されているかどうかは、コンパイラによって異なります。
到達できない文!その名前でそれを見上げるとは思わなかった。ありがとうございました ! –
バイトコードをチェックしましたか? – PermGenError
これはテストコンパイルが簡単で、javapを使ってバイトコードを見るのが簡単なようです。 (私はjavacではなくJITによって最適化されることを期待しています) –
最終的な変数を使ってこれをテスト(テスト)するのは本当に価値がありますか?通常、ロギングフレームワークを使用し、 'if(log.isDebugEnabled())log.debug(" blah "+ x);'のようなステートメントを書き込みます。テストは毎回実行されますが、 "" blah "+ x"は評価されません。 –