Java比C快吗?

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

结果是Java通常在一半时间内完成。 在使用不同arrays的5次运行中,Java占用大约17秒,而C占用大约32秒(包括从文件中分配和填充arrays的时间,两者都可以忽略不计)。

那么什么会使Java代码比C运行得更快呢? 是否有我遗漏的东西,或者我听不到的一些基础技术?

编辑:也不确定它是否重要,但我使用time命令计时,而不是任何自定义代码。 例如: $time java SortArray

至于编译器选项,我现在无法访问该命令行,但它是OS X 10.10上的默认gcc选项:

gcc sortarray.c -o sortarray

我只是使用默认的javac来编译Java。

javac SortArray.java

C:

 #include  #include  #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  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[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.5secs。
  • 使用-O3进行优化的C代码= 4.5secs。
  • Java代码= 8.5秒。

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

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

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

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

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

人们说C更快的一个原因是你可以用它来分配更多,例如使用低级multithreading,内存分配(通过malloc ),以及其他可以大大加快程序运行速度的操作。

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

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

  1. 使用了糟糕的编译器
  2. 编写效率低下的代码
  3. 使用较慢的function,结构等

但是,在大多数情况下,C通常运行速度要快得多,并且已知通过Java运行,这是它在大多数操作系统和其他高级软件核心的一个原因。