相同的 for 循环 为什么 Java 比 c 的速度快?

查看 122|回复 12
作者:chaoschick   
Java
public class DuffDevice {
private static int duff2(int count) {
int i = 0;
do {
++i;
} while (--count >0);
return i;
}
public static void main(String[] args) {
int duff;
long start, end;
DuffDevice duffDevice = new DuffDevice();
start = System.currentTimeMillis();
duff = duff2(Integer.MAX_VALUE - 7);
end = System.currentTimeMillis();
System.out.println(duff + " " + (end - start) + " ms");
}
}
C
#include
#include
int duff(int count) {
}
int main(int argc, char* argv[]) {
struct timeval start_time, end_time;
gettimeofday(&start_time, NULL);
long count = 2147483640;
long i = 0;
do {
++i;
} while (--count);
gettimeofday(&end_time, NULL);
int total_time = 1000000 * (end_time.tv_sec - start_time.tv_sec) + (end_time.tv_usec - start_time.tv_usec);
printf("%d us", total_time);
printf("\n");
printf("%.3f ms", (double) total_time / 1000);
printf("\n");
printf("%l", i);
return 0;
}
Java 耗时情况
2 ms
C 耗时情况
4638.628 ms
性能怎么会相差这么大?

int, printf, count, Duff

xtreme1   
https://godbolt.org/z/rTjvMxc5P
tool2d   
@xtreme1 被完全优化掉的不算。

long i = 0;
改成
volatile long i = 0;
时间就正常了。
chaoschick
OP
  
@xtreme1 能解释一下为什么两者性能如此悬殊的原因吗
chaoschick
OP
  
@tool2d 我试试
hefish   
java 的编译器高级。全优化掉了。
chaoschick
OP
  
@tool2d [admin@iZt4ngr7j75qbzgg9ilsifZ c]$ cat duff2.c
#include
#include
int main(int argc, char* argv[]) {
struct timeval start_time, end_time;
gettimeofday(&start_time, NULL);
long count = 2147483640;
volatile long i = 0;
do {
++i;
} while (--count);
gettimeofday(&end_time, NULL);
int total_time = 1000000 * (end_time.tv_sec - start_time.tv_sec) + (end_time.tv_usec - start_time.tv_usec);
printf("%d us", total_time);
printf("\n");
printf("%.3f ms", (double) total_time / 1000);
printf("\n");
printf("%l", i);
return 0;
}
[admin@iZt4ngr7j75qbzgg9ilsifZ c]$ gcc duff2.c && ./a.out
4621705 us
4621.705 ms
wdlth   
我在我的电脑测试结果是:
0 us
0.000 ms
tool2d   
@chaoschick 4 秒正常的啊,我这里也是 4 秒。
0 秒那种都是编译器把循环优化掉了。
diivL   
gcc duff2.c -O3 && ./a.out
您需要登录后才可以回帖 登录 | 立即注册

返回顶部