2017-08-27 17 views
2

私はobjective-cとjavaの両方で動作します。前者では前処理ディレクティブにアクセスできるので、定義されていないときにはサイクルを使用しないデバッグ用の印刷文を定義できます。静的変数を持つブロックの場合

Javaは、私は、コンパイラは、このようなものをどのように処理するか興味があった能力を持っていないので:

public class MyClass { 
    private static final boolean DEBUG = false; 
    public void printMessage(String message) { 
     if (DEBUG) { 
      //sysout 
     } 
    } 
} 

PRINTMESSAGEへの各呼び出しは、パフォーマンスを低下させるのでしょうか、コンパイラはDEBUGが常に偽であることを認識し、補償します各呼び出し? 私が気付いていないこれを処理する良い方法はありますか?

答えて

0

このようなブロックはコンパイラによって自動的に最適化されます。すなわち、それらはコンパイルされたコードの内部に留まらない。

は、次のコードを考えてみましょう:

public class Test { 

    private static final boolean DEBUG = false; 

    public static void main(String[] args) { 
     long time = System.currentTimeMillis(); 
     for (int i = 0; i < 2000000000; i++) { 
      log("hello world"); 
     } 
     System.out.println("Elapsed time: " + (System.currentTimeMillis() - time)); 
    } 

    private static void log(String message) { 
     if (DEBUG) { 
      System.out.println(message); 
     } 
    } 

} 

あなたは上記のコードを実行した場合、それは、0ミリ秒で実行されます。

あなたは(私はそれがのIntelliJ IDEAを形成開く)コンパイル済みのクラスファイルを開いた場合、あなたはこの方法logは、以下のように空であることがわかります。

private static void log(String message) { 
} 

しかし、一方で、あなたは変数を加えた場合DEBUGは最終であり、logの本体はコンパイルされたコードのままです。そして、コードを実行するのに15 msを取ります。

関連する問題