gpt4 book ai didi

java - Java 直接数组索引访问与 for 循环访问之间的性能差异

转载 作者:行者123 更新时间:2023-11-30 07:57:54 25 4
gpt4 key购买 nike

我正在试验谓词。我试图实现用于在分布式系统中序列化问题的谓词。我写了一个简单的例子,其中测试函数只返回 true。我在测量开销时,偶然发现了这个有趣的问题。与直接访问相比,在 for 循环中访问数组要慢 10 倍。

class Test {
public boolean test(Object o) { return true; }
}

long count = 1000000000l;
Test[] test = new Test[3];
test[0] = new Test();
test[1] = new Test();
test[2] = new Test();
long milliseconds = System.currentTimeMillis();
for(int i = 0; i < count; i++){
boolean result = true;
Object object = new Object();
for(int j = 0; j < test.length; j++){
result = result && test[j].test(object);
}
}
System.out.println((System.currentTimeMillis() - milliseconds));

However, the following code is almost 10 times faster. What can be the reason?

milliseconds = System.currentTimeMillis();
for(int i=0 ; i < count; i++) {
Object object = new Object();
boolean result = test[0].test(object) && test[1].test(object) && test[2].test(object);
}
System.out.println((System.currentTimeMillis() - milliseconds));

我的 i5 上的基准测试结果。

  • for 循环访问 4567 毫秒

  • 直接访问 297 毫秒

最佳答案

由于 test(Object o) 的可预测结果,编译器能够非常有效地优化第二段代码。第一段代码中的第二个循环使这种优化变得不可能。

将结果与以下 Test 类进行比较:

static class Test {
public boolean test(Object o) {
return Math.random() > 0.5;
}
}

...和循环:

    long count = 100000000l;
Test[] test = new Test[3];
test[0] = new Test();
test[1] = new Test();
test[2] = new Test();

long milliseconds = System.currentTimeMillis();

for(int i = 0; i < count; i++){
boolean result = true;
Object object = new Object();
for(int j = 0; j < test.length; j++){
result = result && test[j].test(object);
}
}

System.out.println((System.currentTimeMillis() - milliseconds));
milliseconds = System.currentTimeMillis();

for(int i=0 ; i < count; i++) {
Object object = new Object();
boolean result = test[0].test(object) && test[1].test(object) && test[2].test(object);
}

System.out.println((System.currentTimeMillis() - milliseconds));

现在两个循环几乎需要相同的时间:

run:
3759
3368
BUILD SUCCESSFUL (total time: 7 seconds)

附注: 查看 this article有关 JIT 编译器优化的更多信息。

关于java - Java 直接数组索引访问与 for 循环访问之间的性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40851205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com