我想了解Java对连续循环做了什么样的优化.更确切地说,我正在尝试检查是否执行了循环融合.从理论上讲,我期待这种优化不会自动完成,并且期望确认融合版本比具有两个循环的版本更快.
但是,在运行基准测试之后,结果显示两个独立(和连续)循环比完成所有工作的单个循环更快.
我已经尝试使用JMH创建基准测试并获得相同的结果.
我使用了该javap命令,它显示生成的具有两个循环的源文件的字节码实际上对应于正在执行的两个循环(没有循环展开或执行其他优化).
正在测量的代码BenchmarkMultipleLoops.java:
private void work() {
List<Capsule> intermediate = new ArrayList<>();
List<String> res = new ArrayList<>();
int totalLength = 0;
for (Capsule c : caps) {
if(c.getNumber() > 100000000){
intermediate.add(c);
}
}
for (Capsule c : intermediate) {
String s = "new_word" + c.getNumber();
res.add(s);
}
//Loop to assure the end result (res) is used for something
for(String s : res){
totalLength += s.length();
}
System.out.println(totalLength);
}
Run Code Online (Sandbox Code Playgroud)
正在测量的代码BenchmarkSingleLoop.java:
private void work(){ …Run Code Online (Sandbox Code Playgroud)