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)
您对运行时的比较是不公平和有缺陷的.您使用默认编译器选项,但Java和C在默认情况下启用的优化方式不同.一般来说,没有启用优化的测量性能本身就完全无用,输出可能会在现实世界中完全改变,具体取决于哪些可以进行更优化.
Java使用JIT来优化代码,即使使用默认选项也可以运行.
对于gcc,默认优化选项-O0意味着根本没有完成任何优化.尝试使用-O2或-O3进行更公平的比较.
例如,我的机器上的结果是:
-O3用于启用优化的C代码= 4.5secs.| 归档时间: |
|
| 查看次数: |
2331 次 |
| 最近记录: |