Osc*_*Ryz 8 c java performance
灵感来自这个问题,
现在仅对具有> 10k rep的用户可见
我想出了以下代码:
$cat loop.c
int main( int argc, char ** argv )
{
int i = 0;
while( i++ < 2147483647 );
}
$cc -o loop loop.c
$ time ./loop
real 0m11.161s
user 0m10.393s
sys 0m0.012s
$cat Loop.java
class Loop {
public static void main( String [] args ) {
int i = 0;
while( i++ < 2147483647 );
}
}
$javac Loop.java
$time java Loop
real 0m4.578s
user 0m3.980s
sys 0m0.048s
Run Code Online (Sandbox Code Playgroud)
为什么Java版本的运行速度比C版快3倍?我在这里缺少什么?
这是在Ubuntu 9.04上运行的:
英特尔(R)奔腾(R)M @ 1.73GHz
32位
编辑
这真太了不起了.在C中使用-O3选项优化循环并在Java中使用-server也是如此.这是"优化时代". 优化了http://img196.imageshack.us/img196/6489/screenshot4rv.png
Car*_*rum 30
我期望javac默认的优化程度高于你的C编译器.当我在-O3这里编译时,C更快:
C用-O3:
real 0m0.003s
user 0m0.000s
sys 0m0.002s
Run Code Online (Sandbox Code Playgroud)
你的java程序:
real 0m0.294s
user 0m0.269s
sys 0m0.051s
Run Code Online (Sandbox Code Playgroud)
更多细节; 没有优化,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
Run Code Online (Sandbox Code Playgroud)
使用optimization(-O3),它看起来像这样:
0000000100000f30 pushq %rbp
0000000100000f31 movq %rsp,%rbp
0000000100000f34 xorl %eax,%eax
0000000100000f36 leave
0000000100000f37 ret
Run Code Online (Sandbox Code Playgroud)
如您所见,整个循环已被删除. 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
}
Run Code Online (Sandbox Code Playgroud)
看起来循环是编译进来的,我想在运行时会发生一些事情来加速这个循环.(正如其他人提到的那样,JIT编译器会压缩循环.)
我的猜测是JIT正在优化空循环.
更新:Java性能调优文章Followup to Empty Loop Benchmark似乎支持这一点,以及其他答案,指出C代码也需要进行优化才能进行有意义的比较.关键报价:
如果我选择使用客户端模式1.4.1 JVM(客户端是默认模式),则不会优化循环.如果我选择使用Microsoft的C++编译器,那么C版本就会花费时间.显然,编译器的选择至关重要.
这里有一些你需要控制的东西:
| 归档时间: |
|
| 查看次数: |
1813 次 |
| 最近记录: |