首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2013-06-25 
为什么同样的代码java运行比c快c语言:#include stdio.h#include time.hint main(){clock_t time clo

为什么同样的代码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快一点..

热点排行