以Oracle/Sun JDK8u / OpenJDK8u的实现来看,首先看javac对下面俩语句的编译结果:
public void foo() {
int i = 0;
while (true) { i++; }
}
/*
public void foo();
Code:
stack=1, locals=2, args_size=1
0: iconst_0
1: istore_1
2: iinc 1, 1
5: goto 2
*/
与
public void bar() {
int i = 0;
for (;;) { i++; }
}
/*
public void bar();
Code:
stack=1, locals=2, args_size=1
0: iconst_0
1: istore_1
2: iinc 1, 1
5: goto 2
*/
连javac这种几乎什么优化都不做(只做了Java语言规范规定一定要做的常量折叠,和非常少量别的优化)的编译器,对上面俩版本的代码都生成了一样的字节码。后面到解释执行、JIT编译之类的就不用说了,输入都一样,输出也不会不同。
性能差异要看具体实现,无法一概而论。在Oracle/Sun JDK/OpenJDK 上的话是没有可感知的性能差异的
转自:https://www.zhihu.com/question/52311366
以Oracle/Sun JDK8u和OpenJDK8u实现为例,javac编译器对特定代码生成相同字节码,后续解释执行、JIT编译输入相同输出也相同。性能差异因具体实现而异,在这两者上无明显可感知性能差异。
2624

被折叠的 条评论
为什么被折叠?



