今天我做了一个简单的测试来比较java和c之间的速度 - 一个简单的循环使整数“i”从0增加到20亿。
我真的希望c语言比java更快。我对结果感到惊讶:
java:about 所需的时间(以秒为单位)。 1.8 秒
c:约所需的时间(以秒为单位)。 3.6 秒。
我根本不认为java是一种更快的语言,但我不明白为什么循环的速度是我简单程序中c的两倍?
我在节目中犯了一个重要的错误吗?或者是MinGW的编译器配置不当还是什么?
public class Jrand {
public static void main (String[] args) {
long startTime = System.currentTimeMillis();
int i;
for (i = 0; i < 2000000000; i++) {
// Do nothing!
}
long endTime = System.currentTimeMillis();
float totalTime = (endTime - startTime);
System.out.println("time: " + totalTime/1000);
}
}
C-PROGRAM
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
int main () {
clock_t startTime;
startTime = clock();
int i;
for (i = 0; i <= 2000000000; i++) {
// Do nothing
}
clock_t endTime;
endTime = clock();
float totalTime = endTime - startTime;
printf("%f", totalTime/1000);
return 0;
}
答案 0 :(得分:22)
使用-O0
以外的任何优化级别(例如-O2
)重建您的C版本,您会发现它在0秒内运行。所以Java版本需要1.6秒才能做什么,而C版本需要0.0秒(实际上,大约0.00005秒)才能做什么。
答案 1 :(得分:10)
Java在消除无法执行任何操作的代码方面更为积极。不太可能认为开发人员知道他们在做什么。你没有计算循环,但java需要多长时间才能检测并消除循环。
简而言之,Java通常更快无效。
另外,您可能会发现,如果您优化C代码并删除调试信息,它将执行相同的操作,很可能会更短。
答案 2 :(得分:1)
如果你想对此进行基准测试,而不是做任何事情,尝试一些有用的东西,比如计算每次迭代的东西。对于例如计算其他变量中的循环,并确保在最后使用它(例如打印它),这样它就不会被优化掉。
备用简单测试可以是线性访问数组(只读),将元素从一个数组复制到另一个数组(读取+写入),或者对数据执行某些操作。其中一些情况可能很有趣,因为它们打开了几个非常简单的编译器优化,您可以稍后在结果二进制/字节码中看到它们,例如循环展开,寄存器分配,甚至可能更复杂的东西,如矢量化或代码运动。另一方面,Java可能会采用一些更糟糕的技巧,例如jitting(动态重新编译)
编译器优化的范围很大,你刚遇到最基本的 - 消除了无用的代码:)