【发布时间】:2013-09-11 02:59:12
【问题描述】:
这个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; 的稍微简单的方法得到了完全优化(caliper 报告 0.460543 ns)。
但即使我们同意优化返回常量结果的方法对实际代码没有用处,仍然存在循环展开,这可能会导致类似
static int slowItDown() {
int result = 0;
for (int i = 1; i <= 1000; i += 2) {
result += 2 * i + 1;
}
return result;
}
所以我的问题仍然存在:为什么这里没有进行优化?
1与我原来写的相反;我一定看到了什么不存在的东西。
【问题讨论】:
-
你是如何测试这个的?如果使用 JIT,您可能会通过稍微更改代码来观察类似的事情,因为其中涉及很多启发式方法。即使是最简单的优化(如内联),您也无法保证 JIT 会应用,因为它只在认为必要时才会这样做。
-
这是真实的代码吗?如果您知道返回的含义,为什么不直接这样编写代码呢?我很满意 JIT 编译器经过调整以优化 real 代码,而不是优化掉在现实中不会发生的代码。 (静态优化器比这有更多的余地,但请记住,JIT 编译器试图找到的每一个优化在执行时都有成本*。)
-
@JonSkeet:令人尴尬的是,我观察到该链接指向 Guava 基准测试代码,我通常希望信任它......
-
返回 x + super.compareTo(e) - x; // 愚蠢的尝试阻止优化。所以他们似乎至少知道:)
-
@assylias:我无法重现方法被优化掉的情况!在我重写问题之前,我会再试一次。
标签: java guava compiler-optimization