为什么第一次打电话这么久?

时间:2017-05-24 09:21:01

标签: java jit

我发现某些功能的第一次调用需要很长时间。 这是我的简单测试:

public class MainTest {
    public static void main(String[] args) {
        long k = 0;
        for (int i = 0; i < 10; i++) {
            long start = System.nanoTime();
            k += doWork(i);
            System.out.println(System.nanoTime() - start);
        }
        System.out.println(k);    
    }

    public static long doWork(long var) {
        for (int i = 0; i < 100000; i++) {
            var += i;
        }
        return var;
    }
}

结果:

820521
283961
292514
259442
88952
86100
82965
81539
74126
29651

你能给我一些关于它为什么会发生的版本吗?或者我能找到答案的一些资源。它可以与JIT连接,但我不确定。

我知道纳米时不适合测试。我试试JMH:

# Warmup Iteration   1: 179791124,395 ops/s
# Warmup Iteration   2: 183962412,435 ops/s
# Warmup Iteration   3: 284320650,805 ops/s

1 个答案:

答案 0 :(得分:4)

这里有两个方面:

  • 您的基准测试基本上存在缺陷并搞砸了。您想阅读this
  • 是的,JIT需要 warm up

简单地说:在运行时,JIT会观察您的代码正在做什么。它应用启发式来触发优化调用。因此:不要预期确定性行为。 hard 来获得真正有意义的数字。

为了获得更可靠的结果,您必须显着提高&#34;测量的质量&#34;过程