Java比C快

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


用除-O0之外的任何优化级别(例如-O2)重建您的C版本,您将发现它在0秒内运行。因此,Java版本需要1.6秒的时间什么也不做,而C版本需要0秒(实际上,大约0.00005秒)什么也不做。


Java在消除不做任何事情的代码方面更具侵略性。不太可能假设开发人员知道他们在做什么。您不是在计时循环,而是用Java检测和消除循环需要多长时间。

简而言之,Java在做任何有用的事情时往往更快。

另外,您可能会发现,如果您优化了C代码并删除了调试信息,那么它也会做同样的事情,很可能会更短。


如果您希望对此进行基准测试,而不是什么都不做,那么尝试一些有用的方法,比如在每个迭代中计算一些东西。例如,计算其他变量中的循环数,并确保在末尾使用它(例如,通过打印它),这样它就不会被优化。

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

编译器优化的范围是巨大的,您刚刚遇到了最基本的一个-消除无用的代码:)