gpt4 book ai didi

java - 为什么这个方法没有得到优化?

转载 作者:搜寻专家 更新时间:2023-10-31 20:20:57 24 4
gpt4 key购买 nike

Java method在基准测试中用于模拟慢速计算:

static int slowItDown() {
int result = 0;
for (int i = 1; i <= 1000; i++) {
result += i;
}
return result;
}

恕我直言,这是一个非常糟糕的主意,因为它的主体可以被 return 500500 替换。 这似乎永远不会发生1;正如 Jon Skeet 所说,可能是因为这种优化与实际代码无关。

有趣的是,使用 result += 1; 的稍微简单的方法得到了完全优化(卡尺报告 0.460543 ns)。

但即使我们同意优化返回常量结果的方法对实际代码毫无用处,仍然存在循环展开,这可能导致类似的事情

static int slowItDown() {
int result = 0;
for (int i = 1; i <= 1000; i += 2) {
result += 2 * i + 1;
}
return result;
}

所以我的问题仍然存在:为什么这里没有进行优化?

1和我原来写的相反;我一定是看到了不存在的东西。

最佳答案

好吧,JVM 确实优化掉了这样的代码。问题是在以这种方式进行分析之前,必须将其检测为真正的热点(基准测试通常比这种单一方法做的更多)多少次。在我的设置中,在执行时间变为(几乎)为零之前需要 16830 次调用。

这样的代码没有出现在真实代码中是正确的。然而,在其他热点处理的值不是编译时常量而是运行时常量或实际常量(理论上可能会改变但实际上不会改变的值)的几次内联操作之后,它可能仍然存在。当这样一段代码仍然存在时,将其完全优化掉是一个很大的好处,但预计不会很快发生,即当直接从 main 方法调用时。

更新:我简化了代码,优化来得更早。

public static void main(String[] args) {
final int inner=10;
final float innerFrac=1f/inner;
int count=0;
for(int j=0; j<Integer.MAX_VALUE; j++) {
long t0=System.nanoTime();
for(int i=0; i<inner; i++) slowItDown();
long t1=System.nanoTime();
count+=inner;
final float dt = (t1-t0)*innerFrac;
System.out.printf("execution time: %.0f ns%n", dt);
if(dt<10) break;
}
System.out.println("after "+count+" invocations");
System.out.println(System.getProperty("java.version"));
System.out.println(System.getProperty("java.vm.version"));
}
static int slowItDown() {
int result = 0;
for (int i = 1; i <= 1000; i++) {
result += i;
}
return result;
}

execution time: 0 ns
after 15300 invocations
1.7.0_13
23.7-b01

(64 位服务器虚拟机)

关于java - 为什么这个方法没有得到优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18667440/

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