Java中有趣的行为

Java中有趣的行为,java,Java,我运行这段代码并获得两个循环块的运行时间。有趣的是,当我设置j2的上限时,每个块的运行时间约为3500ms,但当我使用j10的上限运行时,运行时间是它的上限,因为JIT编译器在运行时优化代码 因此,当您只通过2次时,优化将不如10次或100次迭代后好 所以基本上这个标记是错误的。这就是为什么为了衡量这种执行情况,你应该 使用预热会话-干运行测试代码,这样它将得到优化 做有意义的完全迭代-1或2不是那么有意义-1000次运行更好-并获得平均时间 我只是想知道这是否是micro bechmarkin

我运行这段代码并获得两个循环块的运行时间。有趣的是,当我设置j2的上限时,每个块的运行时间约为3500ms,但当我使用j10的上限运行时,运行时间是它的上限,因为JIT编译器在运行时优化代码

因此,当您只通过2次时,优化将不如10次或100次迭代后好

所以基本上这个标记是错误的。这就是为什么为了衡量这种执行情况,你应该

  • 使用预热会话-干运行测试代码,这样它将得到优化
  • 做有意义的完全迭代-1或2不是那么有意义-1000次运行更好-并获得平均时间

  • 我只是想知道这是否是micro bechmarking的一个问题,需要运行多少次这些代码?这些时间意味着什么?或者这是一个“只运行一次”的度量?在每次运行中,我都会得到相同的结果可能是编译器解压了您的循环?可能是!如果j-loop-upper-bounf大于10:DI,我认为这并不能真正回答为什么更少的迭代比更多的迭代更快。这可能解释了为什么每次迭代,在大量迭代中,平均持续时间可能较低,但OP是测量总时间的。
            long start = System.currentTimeMillis();
            int a = 10;
            for (int i = 0; i < Integer.MAX_VALUE; i++) {
                for (int j = 0; j < 10; j++) {
                    for (int k = 0; k < 1; k++) {
                        a += 2;
                    }
                }
            }
            long finish = System.currentTimeMillis();
            System.out.println(finish - start);
    
            start = System.currentTimeMillis();
            a = 10;
            for (int i = 0; i < Integer.MAX_VALUE; i++) {
                for (int j = 0; j < 10; j++) {
                    for (int k = 0; k < 1; k++) {
                        a = a + 2;
                    }
                }
            }
            finish = System.currentTimeMillis();
            System.out.println(finish - start);
    
            long start = System.currentTimeMillis();
            int a = 10;
            for (int i = 0; i < Integer.MAX_VALUE; i++) {
                for (int j = 0; j < 2; j++) {
                    for (int k = 0; k < 1; k++) {
                        a += 2;
                    }
                }
            }
            long finish = System.currentTimeMillis();
            System.out.println(finish - start);
    
            start = System.currentTimeMillis();
            a = 10;
            for (int i = 0; i < Integer.MAX_VALUE; i++) {
                for (int j = 0; j < 2; j++) {
                    for (int k = 0; k < 1; k++) {
                        a = a + 2;
                    }
                }
            }
            finish = System.currentTimeMillis();
            System.out.println(finish - start);