Java比C快

时间:2013-09-16 17:42:45

标签: java c performance

今天我做了一个简单的测试来比较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;
}

3 个答案:

答案 0 :(得分:22)

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

答案 1 :(得分:10)

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

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

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

答案 2 :(得分:1)

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

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

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