Java faster than C
本问题已经有最佳答案,请猛点这里访问。
今天,我做了一个简单的测试来比较Java和C之间的速度,这是一个简单的循环,使整数"i"从0增加到二十亿。
我真的希望C语言比Java更快。我对结果感到惊讶:
Java的秒数:大约1.8秒
C所需时间(秒):约3.6秒。
我不认为Java是一种更快的语言,但我也不明白为什么在我的简单程序中循环的速度是C的两倍?
我在这项计划中犯了重大错误吗?或者Mingw的编译器配置不好还是什么?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #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; } |
号
用除
Java在消除不做任何事情的代码方面更具侵略性。不太可能假设开发人员知道他们在做什么。您不是在计时循环,而是用Java检测和消除循环需要多长时间。
简而言之,Java在做任何有用的事情时往往更快。
另外,您可能会发现,如果您优化了C代码并删除了调试信息,那么它也会做同样的事情,很可能会更短。
如果您希望对此进行基准测试,而不是什么都不做,那么尝试一些有用的方法,比如在每个迭代中计算一些东西。例如,计算其他变量中的循环数,并确保在末尾使用它(例如,通过打印它),这样它就不会被优化。
可选的简单测试可以线性地访问数组(只读),将元素从一个数组复制到另一个数组(读+写),或者对数据执行一些操作。其中一些情况可能很有趣,因为它们打开了几个非常简单的编译器优化,您稍后可以在结果二进制/字节码中看到这些优化,例如循环展开、寄存器分配,以及可能更复杂的东西,如矢量化或代码运动。另一方面,Java可以采用一些急促的技巧,比如JIT(动态地重新编译)。
编译器优化的范围是巨大的,您刚刚遇到了最基本的一个-消除无用的代码:)