有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么第一次调用这么长?

我发现某些函数的第一次调用花费的时间太长。 下面是我的简单测试:

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) 个答案

  1. # 1 楼答案

    这里有两个方面:

    • 你的基准基本上是有缺陷的,而且搞砸了。你想读this
    • 是的,JIT需要一个warm up

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

    为了获得更可靠的结果,您必须大大提高“测量”过程的质量