java - 稍后在代码中重置变量会使较早的代码块运行速度变慢。为什么?

标签 java

我有以下程序。当我注意到一些不寻常的事情时,我只是在摆弄其他东西。 “y = 3;”行似乎对前一个代码块的运行速度有影响。当该行被注释掉时,代码前半部分的运行速度比后半部分慢大约十倍。然而,当该线路未注释时,两个半部以相同的速度运行。有趣的是,有问题的行不应该执行任何操作,因为此时 y 的值已经是 3。

编辑: 我在“y=3”上方添加了“System.out.println(y)”行,它打印了 3。这就是为什么我认为它是 3。我是根据程序的输出进行测量的。它打印的两行是两个运行时间,底部的计时器代码清楚地显示了我如何测量时间。

/**
 * @author lpreams
 */
public class Misc {
    public static void main(String[] args) {
        new Misc().run();
    }

    public void run() {
        Timer t = new Timer();
        t.start();
        int y = Integer.MIN_VALUE;
        for (int j = 0; j < Integer.MAX_VALUE; ++j) {
            for (int i = 0; i < Integer.MAX_VALUE; ++i) {
                ++y;
            }
        }
        t.stop();
        System.out.println(t.getElapsedTime());
        t.reset();      
        //y = 3;
        t.start();
        for (int j = 0; j < Integer.MAX_VALUE; ++j) {
            for (int i = 0; i < Integer.MAX_VALUE; ++i) {
                ++y;
            }
        }
        t.stop();
        System.out.println(t.getElapsedTime());
    }

    private static class Timer {

        private long startTime = 0;
        private long stopTime = 0;
        private long elapsed = 0;

        public void start() {
            this.startTime = System.nanoTime()/1000000;
        }

        public void stop() {
            this.stopTime = System.nanoTime()/1000000;
            elapsed += stopTime - startTime;
        }

        public long getElapsedTime() {
            return elapsed;
        }
        public void reset() {
            elapsed = 0;
        }
    }
}

我在 OS X 10.9.2 上的 Eclipse 中运行此代码。我正在运行最新版本的java。我的机器是 MacBook Pro,配备 2.4GHz Core 2 Duo 和 8GB RAM。

最佳答案

您从这个微基准测试中获得的任何结果都是值得怀疑的。您没有考虑 JVM 预热效果。

话虽如此,如果我们可以假设效果是真实的,我会将其归因于 JIT 优化器无法检测到第一个循环体可以被优化掉......当y = 3 赋值就在那里。您遇到的情况是,增加一点“复杂性”会抑制优化。它发生了。

(分配的值并不重要。这与 JIT 编译器的代码生成有关......这发生在您预测的 y 值之前 be 3 可以通过任何东西计算。它可以影响 JIT 编译器的行为。)

关于java - 稍后在代码中重置变量会使较早的代码块运行速度变慢。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23255783/

相关文章:

java - 新增、删除字符串差异

java - 类中的方法不能应用于给定类型。必需 : no arguments

java - 为什么编译错误: “illegal start of type public static double” ?

java - 如何使用 JavaMail API 通过 Java 发送电子邮件中的二进制附件?

java - 在 NodeJs 中编写 Java.class 文件(保留魔数(Magic Number))

java - 如何组合两个实现?

java - 按下后退按钮时避免启动屏幕 Activity

java - 如何使用 `org.apache.hadoop.io.Text` 创建 SequenceFiles ?

java - 如何用Java读取CSV文件然后通过AES算法加密

java - 单击打开 JComboBox 时 JTable 单元格丢失值