【问题标题】:if blocks with static variables [duplicate]如果带有静态变量的块[重复]
【发布时间】:2023-03-18 22:49:01
【问题描述】:

我同时使用objective-c 和java。在前者中,我可以访问预处理指令,因此我可以为调试定义打印语句,在未定义时不使用循环。

由于 Java 没有这种能力,我很好奇编译器如何处理这样的事情:

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

每次调用 printMessage 会降低性能,还是编译器会识别 DEBUG 始终为假并补偿每次调用? 有没有更好的方法来处理这个我不知道的?

【问题讨论】:

    标签: java android


    【解决方案1】:

    编译器会自动优化这些块。即,它们不会留在编译后的代码中。

    考虑以下代码:

    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 ms 内运行。

    如果你打开编译好的class文件(我是从IntelliJ IDEA打开的),你可以看到log这个方法是空的,如下:

    private static void log(String message) {
    }
    

    但另一方面,如果您将变量 DEBUG not finallog 函数的主体将保留在编译后的代码中。运行代码大约需要 15 毫秒

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-04
      • 1970-01-01
      • 2016-04-27
      • 1970-01-01
      • 2017-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多