Java比C快吗?

时间:2015-04-15 23:51:59

标签: java c arrays performance sorting

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

结果是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;
}

爪哇:

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] + ", ");
    }

}
}

3 个答案:

答案 0 :(得分:7)

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

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

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

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

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

答案 1 :(得分:1)

首先,比较语言是完全错误的,有时你可以比较相同语言的编译器,但不能语言本身

无论如何,java可能更快,因为它有JIT,这意味着在运行时java收集一些统计信息并可以执行额外的优化或缓存,这几乎是不可能的c编译器

虽然有些c编译器具有探查器引导的优化循环,但这种优化的最终结果将/可以更快地运行java代码

答案 2 :(得分:0)

它们在设计上是两种不同的语言,应该这样对待。

C是一种低级可执行编译语言,可以执行低级硬件操作,例如动态内存分配,以及访问非常低级别的硬件驱动程序。如果有效地编写C,C通常比Java快,但它总是取决于编译器。一些编译器支持编译时的优化,通过删除冗余代码和其他不必要的伪像来生成更高效的代码。

人们说C更快的一个原因是因为你可以用它来分配更多,例如使用低级多线程,内存分配(通过malloc),以及其他可以加速程序的操作#39;操作相当多。

另一方面,Java被编译为JVM字节码,它完全取决于JVM(用C ++编写)的速度。 Java比C更少的低级功能,因此在某些情况下会降低速度,其中C会更快地运行。

总的来说,你的程序在C中失去性能的一般原因是你

  1. 使用了错误的编译器
  2. 编写效率低下的代码
  3. 使用较慢的功能,结构等
  4. 但是,在大多数情况下,C通常运行得更快,并且已知通过Java运行,这是它在大多数操作系统和其他高级软件核心的一个原因。