我预计javac
默认为比 C 编译器更高级别的优化。当我编译时-O3
在这里,C 更快:
C with -O3
:
real 0m0.003s
user 0m0.000s
sys 0m0.002s
你的java程序:
real 0m0.294s
user 0m0.269s
sys 0m0.051s
更多细节;如果没有优化,C 编译为:
0000000100000f18 pushq %rbp
0000000100000f19 movq %rsp,%rbp
0000000100000f1c movl %edi,0xec(%rbp)
0000000100000f1f movq %rsi,0xe0(%rbp)
0000000100000f23 movl $0x00000000,0xfc(%rbp)
0000000100000f2a incl 0xfc(%rbp)
0000000100000f2d movl $0x80000000,%eax
0000000100000f32 cmpl %eax,0xfc(%rbp)
0000000100000f35 jne 0x00000f2a
0000000100000f37 movl $0x00000000,%eax
0000000100000f3c leave
0000000100000f3d ret
通过优化(-O3
),它看起来像这样:
0000000100000f30 pushq %rbp
0000000100000f31 movq %rsp,%rbp
0000000100000f34 xorl %eax,%eax
0000000100000f36 leave
0000000100000f37 ret
如您所见,整个循环已被删除。javap -c Loop
给了我 java 字节码的输出:
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: iinc 1, 1
6: ldc #2; //int 2147483647
8: if_icmpge 14
11: goto 2
14: return
}
看来循环是编译进去的,我猜想在运行时会发生一些事情来加速循环。 (正如其他人提到的,JIT 编译器会消除循环。)