如果常量会阻止它被使用,优化器是否会阻止创建字符串参数?

时间:2013-03-29 20:40:42

标签: java android logging compiler-optimization

我的问题最好用一个例子。

  public static boolean DEBUG = false;

  public void debugLog(String tag, String message) {
    if (DEBUG)
      Log.d(tag, message);
  }

  public void randomMethod() {
    debugLog("tag string", "message string"); //Example A

    debugLog("tag string", Integer.toString(1));//Example B

    debugLog("tag string", generateString());//Example C 
  }


  public String generateString() {
    return "this string";
  }

我的问题是,在任何一个例子中,A,B或C - 因为最终不会使用字符串,优化程序会将其删除吗?

或者问另一种方式,做下面这样做会更好,从而确保不会创建字符串对象吗?

  public void randomMethod() {
    if (DEBUG) debugLog("tag string", "message string"); //Example A

    if (DEBUG) debugLog("tag string", Integer.toString(1));//Example B

    if (DEBUG) debugLog("tag string", generateString());//Example C 
  }

1 个答案:

答案 0 :(得分:1)

似乎没有删除第一个片段,但它是第二个:

public class TestCompiler {
    public static boolean DEBUG = false;
    private static void debug(Object o) {
        if (DEBUG) {
            System.out.println(o);
        }
    }
    public static void main(String[] args) {
        if (DEBUG) {
            System.out.println(new InnerClass());
        }
        System.out.println("now nested");
        debug(new InnerClass());
    }
    private static final class InnerClass {
        static {
            System.out.println("Innerclass initialized");
        }
    }
}

对我来说(openjdk7),结果是:

now nested
Innerclass initialized

意味着删除了if (DEBUG) {...},但方法调用未被删除,因此设置了方法参数。