处理重写方法数组取决于它是任意的还是交替的



我有这段代码,我想知道第一个输入和第二个输入的执行时间之间差异的原因。 我认为它应该花费相同的时间,因为我正在调用相同的方法,该方法在 2 个对象中什么都不做。 但是 input1(这是 2 个实例的交替(在我的计算机上需要 5 秒。 和 input2(这是在 2 个实例之间的任意选择(在我的计算机上花费 17 秒。

public class Program {

private static final Runnable FIRST_INSTANCE = () -> {};
private static final Runnable SECOND_INSTANCE = () -> {};
private static Runnable[] input1() {
Runnable[] array = new Runnable[10000];
for (int i = 0; i < array.length; i++) {
array[i] = i % 2 == 0 ? FIRST_INSTANCE : SECOND_INSTANCE;
}
return array;
}

private static Runnable[] input2() {
Random rnd = new Random(0);
Runnable[] array = new Runnable[10000];
for (int i = 0; i < array.length; i++) {
array[i] = rnd.nextBoolean() ? FIRST_INSTANCE : SECOND_INSTANCE;
}
return array;
}

public static void main(String[] args) {
Runnable[] input1 = input1();
Runnable[] input2 = input2();
solve(input1);
solve(input2);
}
private static void solve(Runnable[] array) {
long start = System.nanoTime();
for (int j = 0; j < 500000; j++) {
for (Runnable r : array) {
r.run();
}
}
System.out.println((System.nanoTime() - start) / 1000000000.0);
}
}

我认为这与缓存无关,因为它们使用相同的实例,并且这不是首先调用哪个的问题,因为我尝试在input1之前调用input2并且我得到相同的结果(input2总是更慢(。

某种编译器优化正在发挥作用。

我已经尝试了 50000 次迭代而不是500000 次迭代的代码,因为生命很短。我的时间大约比你好10倍。

首先,我已经运行了你的代码

0.502928476
1.68480928

然后我尝试用-Djava.compiler=NONE运行相同的操作(禁用 JIT(:

25.267888581
24.742234792

请注意,时机变得多么糟糕。JIT绝对是这里的嫌疑人。

然后我试图让input1不那么统一:

array[i] = i % 21 == 0 ? FIRST_INSTANCE : SECOND_INSTANCE;

这并没有产生任何影响。然后我尝试从input1中删除该模式:

array[i] = (int)(Math.sqrt(i) * Math.sqrt(i)) == i ? FIRST_INSTANCE : SECOND_INSTANCE;

0.973357599
1.82497641

input1的表现几乎差了两倍。

所以我的结论如下:由于某种原因,数组的均匀性对 JIT 很重要:)


再看一看:

如果我们根本不运行input,并且运行 5 次而不是两次input2,我们会得到这个:

1.826676411
1.835746098
1.566231165
1.531194014
1.551068832

因此,JIT似乎在第三圈完全启动。请注意,时间是 ~1.5 秒。

现在,如果我们开始运行input1两次,然后继续input2

input1: 2 times
0.507165973
0.509543633
input2: 5 times
1.270496255        <------ WAT?
1.817742481
1.804664757
1.845583904
1.846861045

看起来为input1设置的 JIT 实际上帮助input2了一堆,但后来被扔掉了,从来没有完全恢复

相关内容

  • 没有找到相关文章

最新更新