Java比C更快

今天我做了一个简单的测试来比较java和c之间的速度 – 一个简单的循环使整数“i”从0增加到20亿。

我真的希望c语言比java更快。 我对结果感到惊讶:

java的时间以秒为单位:约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程序

 #include #include #include  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; } 

使用除-O0以外的任何优化级别(例如-O2 )重建C版本,您会发现它在0秒内运行。 所以Java版本需要1.6秒才能做什么,而C版本需要0.0秒(实际上,大约0.00005秒)才能做什么。

Java在消除无法执行任何操作的代码方面更为积极。 它不太可能假设开发人员知道他们在做什么。 你没有计算循环,但是java检测和消除循环需要多长时间。

简而言之,Java通常更快无效。

您也可能会发现,如果您优化C代码并删除调试信息,它将执行相同的操作,很可能更短。

如果你想对此进行基准测试,而不是什么也不做,尝试一些有用的东西,比如计算每次迭代的东西。 例如,计算其他变量中的循环,并确保在最后使用它(例如通过打印它),这样它就不会被优化掉。

替代的简单测试可以是线性访问数组(只读),将元素从一个数组复制到另一个数组(读取+写入),或者对数据执行某些操作。 其中一些情况可能很有趣,因为它们打开了几个非常简单的编译器优化,您稍后可以在结果二进制/字节码中看到它们,例如循环展开,寄存器分配,甚至可能更复杂的东西,如矢量化或代码运动。 另一方面,Java可能会采用一些更糟糕的技巧,例如jitting(动态重新编译)

编译器优化的范围很大,你刚遇到最基本的 – 消除无用的代码:)