8

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

3 回答 3

24

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

于 2013-09-16T17:50:40.003 回答
10

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

简而言之,Java 在无用处通常更快。

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

于 2013-09-16T17:45:06.627 回答
1

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

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

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

于 2013-09-16T20:06:30.320 回答