考虑以下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.
ps:完整的代码源+单元测试可在此处获取:https://gist.github.com/dirtyhenry/5804130
更新:
更新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) 我在学校被告知,修改一个索引变量是一个不好的做法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)