为啥同样的代码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;
}
------解决方案--------------------
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快一点..
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;
}
------解决方案--------------------
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快一点..