gpt4 book ai didi

java - 一个循环中的两个操作与两个循环执行相同的操作每个循环一个

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:18:50 25 4
gpt4 key购买 nike

这个问题与此相同 Two loop bodies or one (result identical)但就我而言,我使用 Java。

我有两个运行十亿次的循环。

int a = 188, b = 144, aMax = 0, bMax = 0;

for (int i = 0; i < 1000000000; i++) {
int t = a ^ i;
if (t > aMax)
aMax = t;
}

for (int i = 0; i < 1000000000; i++) {
int t = b ^ i;
if (t > bMax)
bMax = t;
}

在我的机器上运行这两个循环所需的时间约为 4 秒。当我将这两个循环融合成一个循环并在该循环中执行所有操作时,它会在 2 秒内运行。正如您所看到的,琐碎的操作构成了循环内容,因此需要恒定的时间。

我的问题是我从哪里获得了这种性能改进?

我猜测,在两个单独的循环中,性能受到影响的唯一可能地方是它递增 i 并检查 i < 1000000000 是否为 20 亿次,而如果我将循环融合在一起则只有 10 亿次。里面还有什么事吗?

谢谢!

最佳答案

如果您不运行预热阶段,则可能会优化和编译第一个循环而不是第二个循环,而当您合并它们时,整个合并的循环都会被编译。此外,使用 server 选项和您的代码,由于您不使用结果,大多数都被优化掉了。

我已经运行了下面的测试,将每个循环和合并循环放在它们自己的方法中,并预热 JVM 以确保所有内容都得到编译。

结果(JVM 选项:-server -XX:+PrintCompilation):

  • 循环 1 = 500 毫秒
  • 循环 2 = 900 毫秒
  • 合并循环 = 1,300 毫秒

所以合并循环稍微快一点,但没那么快。

public static void main(String[] args) throws InterruptedException {

for (int i = 0; i < 3; i++) {
loop1();
loop2();
loopBoth();
}

long start = System.nanoTime();

loop1();

long end = System.nanoTime();
System.out.println((end - start) / 1000000);

start = System.nanoTime();
loop2();
end = System.nanoTime();
System.out.println((end - start) / 1000000);

start = System.nanoTime();
loopBoth();
end = System.nanoTime();
System.out.println((end - start) / 1000000);
}

public static void loop1() {
int a = 188, aMax = 0;
for (int i = 0; i < 1000000000; i++) {
int t = a ^ i;
if (t > aMax) {
aMax = t;
}
}
System.out.println(aMax);
}

public static void loop2() {
int b = 144, bMax = 0;
for (int i = 0; i < 1000000000; i++) {
int t = b ^ i;
if (t > bMax) {
bMax = t;
}
}
System.out.println(bMax);
}

public static void loopBoth() {
int a = 188, b = 144, aMax = 0, bMax = 0;

for (int i = 0; i < 1000000000; i++) {
int t = a ^ i;
if (t > aMax) {
aMax = t;
}
int u = b ^ i;
if (u > bMax) {
bMax = u;
}
}
System.out.println(aMax);
System.out.println(bMax);
}

关于java - 一个循环中的两个操作与两个循环执行相同的操作每个循环一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12123409/

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