gpt4 book ai didi

Java比C快?

转载 作者:行者123 更新时间:2023-11-30 21:32:15 25 4
gpt4 key购买 nike

到目前为止,我听到的都是人们说 Java 通常比 C 慢,但有一些异常(exception)(比如涉及不执行任何操作的代码)。于是我就出去测试了一下。我有一个包含 100,000 个介于 0 到 999,999 之间的整数的数组。在 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] + ", ");
}

}
}

最佳答案

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

即使在使用默认选项的情况下运行,Java 也会使用 JIT 来优化代码。

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

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

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

关于Java比C快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29662971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com