为啥同样的代码java运行比c快

为什么同样的代码java运行比c快
c语言:
#include <stdio.h>
#include <time.h>

int main(){
clock_t time = clock();
int n = 0;
int i;

for(i=0; i<1000000000; i++){
n += i;
}

time = clock()-time;

printf("%d %lld\n", n, time/1000);

return 0;
}


java:
public class Main{
public static void main(String[] args){
long time = System.currentTimeMillis();
int n = 0;
int i;

for(i=0; i<1000000000; i++){
n += i;
}

time = System.currentTimeMillis()-time;

System.out.println(n+" "+time);
}
}

求大神解释?

------解决方案--------------------
clock返回的单位和秒没有直接关系。
------解决方案--------------------
这故意构造的超过编译器循环展开优化和常数优化的能力, 就故意折腾编译器用的...

如果循环次数小于 65536 , 几个编译器都直接优化成了常数, 不过M$VC优化好像最差, 唉..
gcc没有优化成类似下面的目标代码, 太失望了:

int i , j;

for(i=0; i<1000000000; i+=1000){
for(j = 0; j < 1000; ++j)
n += i + j; 
}
------解决方案--------------------
引用:
compiler 针对 java 作了优化?


java JIT 的代码应该做了循环展开优化, 没注意 gcc -O2 竟然没有包括  -funroll-loops , 试了下  gcc -O2  -funroll-loops 选项, gcc终于生成了比较正常的目标代码, 生成的目标代码等价于:  for(i=0; i<1000000000; i+=8)  n += 8*i + 28; 在我这的结果是:
没 -funroll-loops 选项时运行时间 500ms左右, 加了后100毫秒左右, Java 的结果 350毫秒左右


------解决方案--------------------
看了下 VS2010 生成的代码, cl -O2 优化下的目标代码, M$的优化太有趣了, 目标代码等价于 :

int n0 , n1 , n2 , n3;
for(i=0; i<1000000000; i+=4) n0 += i, n1 += i + 1 , n2 += i + 2 , n3 += i + 3;
n = n0 + n1 + n2 + n3;

运行时间 210左右, 比Java快一点..