Java 比 C 快? [关闭]
Posted
技术标签:
【中文标题】Java 比 C 快? [关闭]【英文标题】:Java faster than C? [closed] 【发布时间】: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慢” 向我们展示您的代码。你的单点结果没有任何意义,除非它们可以在更广泛的背景下被复制和检查。 【参考方案1】:您对它们的运行时间的比较是不公平且有缺陷的。您使用默认编译器选项,但 Java 和 C 在默认情况下启用的优化有所不同。一般来说,在没有开启优化的情况下测量性能本身是完全没有用的,输出在现实世界中可能会完全改变,具体取决于哪个可以优化更多。
Java 在运行时使用 JIT 优化您的代码,即使使用默认选项。
对于 gcc,默认优化选项是 -O0
,这意味着根本没有进行任何优化。尝试使用-O2
或-O3
进行更公平的比较。
例如我机器上的结果是:
具有默认编译器选项的 C 代码 = 12.5 秒。 使用-O3
启用优化的 C 代码 = 4.5 秒。
Java 代码 = 8.5 秒。
【讨论】:
为什么 C 排序字符而不是像数组那样的整数?【参考方案2】:它们在设计上是两种不同的语言,应该这样对待。
C 是一种低级的可执行编译语言,它可以执行低级硬件操作,例如动态内存分配,以及在非常低的级别访问硬件驱动程序。如果编写效率高,C 通常比 Java 快,但它始终取决于编译器。一些编译器支持编译时优化,通过删除冗余代码和其他不必要的人工制品来生成更高效的代码。
人们说 C 更快的一个原因是因为你可以用它做更多的事情,例如使用低级多线程、内存分配(通过malloc
)以及其他可以大大加快程序运行的操作.
另一方面,Java 被编译为 JVM 字节码,其速度完全取决于 JVM(用 C++ 编写)。 Java 具有比 C 更少的低级功能,因此在某些情况下会降低速度,而 C 会运行得更快。
总体而言,您的程序在 C 语言中可能会失去性能的一般原因是您
-
使用了错误的编译器
编写效率低下的代码
使用了较慢的函数、结构等
但是,在大多数情况下,C 通常运行速度要快得多,而且众所周知,它比 Java 还要快,这也是它成为大多数操作系统和其他高级软件核心的原因之一。
【讨论】:
【参考方案3】:首先比较语言是完全错误的,有时你可以比较同一语言的编译器,但不能比较语言本身
无论如何,java 可能会更快,因为它具有 JIT,这意味着在运行时 java 会收集一些统计信息并可以执行额外的优化或缓存,这对于 c 编译器来说几乎是不可能的
尽管一些 c 编译器具有分析器引导的优化循环,但这种优化的最终结果将/可能运行得更快,也不是 java 代码
【讨论】:
是的,但是 C 不需要 JIT ... AC 程序在编译时已经编译 ... Java 是“解释的”,如果您愿意,可以预编译,但使用另一个使用代码!编译后的 C 已经是 CPU 想要的了! ... @SergioFormiggini 是的,你的意思是什么? 我的观点是关于速度……很明显,C 代码比 Java 代码快。这个问题可能是基于使用 Java 与 C 的优势,这取决于要开发的内容! @SergioFormiggini 你错了,Java 应用程序运行速度都不能更快,我已经解释了什么时候可以回答 IE我试图开发一个程序来计算很多素数。我是用 Java 和 C 实现的。你认为哪个更快?以上是关于Java 比 C 快? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
什么原因,Swift 应该比 Objective-C 快那么多? [关闭]
为啥我的 C++ 代码比 LeetCode 上的 C 代码慢三倍? [关闭]