我使用objective-c和java。在前者中,我可以访问预处理指令,因此我可以定义用于调试的打印语句,在未定义时不使用循环。
由于Java没有能力,我很好奇编译器如何处理这样的事情:
public class MyClass {
private static final boolean DEBUG = false;
public void printMessage(String message) {
if (DEBUG) {
//sysout
}
}
}
每次调用printMessage都会降低性能,还是编译器会认识到DEBUG始终为false并且会补偿每次调用? 有没有更好的方法来处理这个我不知道的事情?
答案 0 :(得分: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 。