相关疑难解决方法(0)

为什么我的JVM做了一些运行时循环优化并使我的代码有问题?

考虑以下java代码:

public int main() {
    int i = 1111;

    for (; rules(i) != true && i < Integer.MAX_VALUE; i++) {
        //LOG.debug("Testing i: " + i);
    }

    System.out.println("The mystery number is: " + i);

    return i;
}

protected boolean rules(int nb) {
    //...
}
Run Code Online (Sandbox Code Playgroud)

我发现即使for循环延续评估是true,循环将在其主体为空时停止执行.

最终结果main是错误的(i16698约98%的时间,有时高一点/更低).

如果我从循环体中取消注释LOG语句,循环将继续运行,直到循环连续评估为止false.

我正在使用的JVM是MacOS X VM 1.6.0.

  • 它正在进行某种运行时优化吗?
  • 这个运行时优化是否可以被视为错误?
  • 或者它是否在Java规范的某处说过,继续评估不应该运行功能操作?

ps:完整的代码源+单元测试可在此处获取:https://gist.github.com/dirtyhenry/5804130

更新:

  • 我只通过junit运行代码.junit可以对这种行为负责吗?

更新2:

java -version
Run Code Online (Sandbox Code Playgroud)

收益:

java version "1.6.0_51"
Java(TM) SE Runtime …
Run Code Online (Sandbox Code Playgroud)

java macos jvm runtime compiler-optimization

10
推荐指数
1
解决办法
1509
查看次数

用于优化循环语句的JVM选项

我在学校被告知,修改一个索引变量是一个不好的做法for loop:

示例:

for(int i = 0 ; i < limit ; i++){
    if(something){
        i+=2;      //bad
    }
    if(something){
        limit+=2;      //bad
    }
}
Run Code Online (Sandbox Code Playgroud)

参数是一些编译器优化可以优化循环,而不是重新计算索引并在每个循环中绑定.

我已经进行了一些测试,java似乎默认索引和绑定每次都会重新计算.

我想知道是否有可能激活这种功能JVM HotSpot

例如,优化这种循环:

for(int i = 0 ; i < foo.getLength() ; i++){   }
Run Code Online (Sandbox Code Playgroud)

无需写:

int length = foo.getLength()
for(int i = 0 ; i < length ; i++){   }
Run Code Online (Sandbox Code Playgroud)

这只是一个例子,我很想尝试看到改进.

编辑

根据Peter Lawrey的回答,为什么在这个简单的例子中JVM没有内联getLenght()方法?:

public static void main(String[] args) {
   Too t = new …
Run Code Online (Sandbox Code Playgroud)

java optimization jvm loops

7
推荐指数
2
解决办法
3685
查看次数

标签 统计

java ×2

jvm ×2

compiler-optimization ×1

loops ×1

macos ×1

optimization ×1

runtime ×1