Java比C快吗?

ccl*_*oyd -5 c java arrays sorting performance

到目前为止我所听到的一切都是人们说Java通常比C慢,但有一些例外(比如涉及代码什么都不做).所以我出去测试它.我在0到999,999之间有一个100,000个整数的数组.我在C和java(在OS X上编译)中使用了一个双循环来将它们从最小到最大排序.

结果是Java通常在一半时间内完成.在使用不同阵列的5次运行中,Java占用大约17秒,而C占用大约32秒(包括从文件中分配和填充阵列的时间,两者都可以忽略不计).

那么什么会使Java代码比C运行得更快?是否有我遗漏的东西,或者我听不到的一些基础技术?

编辑:也不确定它是否重要,但我使用time命令计时,而不是任何自定义代码.例如:$time java SortArray

至于编译器选项,我现在无法访问该命令行,但它是OS X 10.10上的默认gcc选项:

gcc sortarray.c -o sortarray

我只是使用默认的javac来编译Java.

javac SortArray.java

C:

#include <stdio.h>
#include <stdlib.h>

#define SIZE 32

int main()
{
    FILE* file = fopen("bigarray.txt", "r");
    int arraySize = 100000;
    int array[100000] = {};
    int i, j, temp;
    char inputBuffer[SIZE];
    for (i = 0; i < arraySize; i++) {
        fgets(inputBuffer, SIZE, file);
        array[i] = strtod(inputBuffer, NULL);
    }

    for (i = 0; i < arraySize; i++)
        for (j = i + 1; j < arraySize; j++)
            if (array[i] > array[j]) {
                int temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }

    for (i = 0; i < arraySize; i++)
        printf("%d, ", array[i]);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Java的:

import java.io.*;
import java.util.Scanner;

public class SortArray {
public static void main(String[] args) throws IOException {
    System.out.println("Hello world");
    Scanner s = new Scanner(new File("bigarray.txt"));

    int[] array = new int[100000];
    for(int i=0; i<100000; i++) {
        array[i] = s.nextInt();
    }


    for(int i=0; i<array.length; i++) {
        for(int j=i+1; j<array.length; j++) {
            if (array[i] > array[j]) {
                int temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }
    }

    for(int i=0; i<array.length; i++) {
        System.out.print(array[i] + ", ");
    }

}
}
Run Code Online (Sandbox Code Playgroud)

use*_*027 8

您对运行时的比较是不公平和有缺陷的.您使用默认编译器选项,但Java和C在默认情况下启用的优化方式不同.一般来说,没有启用优化的测量性能本身就完全无用,输出可能会在现实世界中完全改变,具体取决于哪些可以进行更优化.

Java使用JIT来优化代码,即使使用默认选项也可以运行.

对于gcc,默认优化选项-O0意味着根本没有完成任何优化.尝试使用-O2-O3进行更公平的比较.

例如,我的机器上的结果是:

  • 带有默认编译器选项的C代码= 12.5secs.
  • -O3用于启用优化的C代码= 4.5secs.
  • Java代码= 8.5秒.