到目前为止,我所听到的一切都是人们说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] + ", ");
}
}
}
答案 0 :(得分:7)
您对运行时的比较是不公平和有缺陷的。您使用默认编译器选项,但Java和C在默认情况下启用的优化方式不同。一般来说,没有启用优化的测量性能本身就完全无用,输出可能会在现实世界中完全改变,具体取决于哪些可以进行更优化。
Java使用JIT优化代码,即使使用默认选项也可以运行。
对于gcc,默认优化选项是-O0
,这意味着根本没有进行任何优化。尝试使用-O2
或-O3
进行更公平的比较。
例如我的机器上的结果是:
-O3
启用优化的C代码= 4.5secs。答案 1 :(得分:1)
首先,比较语言是完全错误的,有时你可以比较相同语言的编译器,但不能语言本身
无论如何,java可能更快,因为它有JIT,这意味着在运行时java收集一些统计信息并可以执行额外的优化或缓存,这几乎是不可能的c编译器
虽然有些c编译器具有探查器引导的优化循环,但这种优化的最终结果将/可以更快地运行java代码
答案 2 :(得分:0)
它们在设计上是两种不同的语言,应该这样对待。
C是一种低级可执行编译语言,可以执行低级硬件操作,例如动态内存分配,以及访问非常低级别的硬件驱动程序。如果有效地编写C,C通常比Java快,但它总是取决于编译器。一些编译器支持编译时的优化,通过删除冗余代码和其他不必要的伪像来生成更高效的代码。
人们说C更快的一个原因是因为你可以用它来分配更多,例如使用低级多线程,内存分配(通过malloc
),以及其他可以加速程序的操作#39;操作相当多。
总的来说,你的程序在C中失去性能的一般原因是你
但是,在大多数情况下,C通常运行得更快,并且已知通过Java运行,这是它在大多数操作系统和其他高级软件核心的一个原因。