【发布时间】:2015-06-22 03:59:20
【问题描述】:
到目前为止,我所听到的一切都是人们说 Java 通常比 C 慢,但有一些例外(比如涉及什么都不做的代码)。于是我出去测试了一下。我有一个 0 到 999,999 之间的 100,000 个整数的数组。在 C 和 java(在 OS X 上编译)中,我使用双 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;
}
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] + ", ");
}
}
}
【问题讨论】:
-
你从哪里听说的?几乎总是相反的说法。不管对错,C 是速度的黄金标准。
-
Java不比 C 快。愿意发布您的代码吗?你可能在做一些低效的事情。
-
啊,是的,基准大战!!这场战斗已经持续了大约 20 年。根据上下文,任何一个都可以“获胜”。但可以说,“性能很差”并不是拒绝 Java 作为编程语言的正当理由。性能更多地取决于正在执行的功能以及程序员将实现与手头资源匹配的程度。
-
我认为第一句话的意思是“说Java通常比C慢”
-
向我们展示您的代码。你的单点结果没有任何意义,除非它们可以在更广泛的背景下被复制和检查。
标签: java c arrays performance sorting