Java:消除死代码
我想知道Java如何处理以下情况:
假设我有一个名为Debug的类,它看起来像这样:
public class Debug {
private static final boolean isAssertEnabled = true;
public static void assertTrue(boolean b, String errorMessage) {
if (isAssertEnabled) {
if (!b) {
throw new RuntimeException(errorMessage);
}
}
}
}
并假设我的代码有一个看起来像这样的调用:
...Debug.assertTrue((x + y != z) && (v - u > w), "Some error message");
....
我有几个问题:
- 如果 标志设置为 ,是否将整个对Debug.assertTrue的调用编译出来?请注意,仅在调用函数后才检查isAssertEnabled == true。
- 如果整个调用确实被编译出来了,是否也意味着布尔表达式的求值被编译出来了?毫无价值地评估该表达将是浪费。
感谢您的帮助!
回答:
布尔表达式的求值 不应 编译掉-至少由javac编译。
即使 当前Debug
该类文件不使用该值,在执行时还是会这样吗? __
在使Debug类编译(通过使isAssertEnabled
静态)后,javac仍然包含代码-
但我希望JIT编译器将其删除(尽管您应该看到Peter引用的问题)。我不确定是否可以将该方法内联为零。同样,如果JIT编译器可以做到这一点,并且 如果
意识到对参数进行评估不会有任何副作用,则它有可能避免评估。不过,我不会亲自编写代码。
以上是 Java:消除死代码 的全部内容, 来源链接: utcz.com/qa/412550.html