为什么C比Java慢得多?
所以,我对 C 完全陌生。我正在测试这些语言的性能。
我做了什么?
我用 C 编写了两个程序,一个是用 Java 编写的,它们都做同样的事情,但是与 Java 相比,C 非常慢?
以下是程序:
主文件:
#include <stdio.h>
#include <time.h>
#include <conio.h>
void work();
int main() {
time_t seconds;
seconds = time(NULL);
printf("time1 : %ldn", seconds);
work();
seconds = time(NULL);
printf("time2 : %ldn", seconds);
return 0;
}
void work() {
int a[1000][500];
for (int k = 0; k < 10000; ++k) {
for (int i = 0; i < 1000; ++i) {
for (int j = 0; j < 500; ++j) {
a[i][j] = (i + j) * 5416585;
}
}
}
}
主程序
public class Main {
public static void main(String[] args) {
System.out.println("time1 : " + (System.currentTimeMillis() / 1000));
work();
System.out.println("time2 : " + (System.currentTimeMillis() / 1000));
}
public static void work() {
int a[][] = new int[1000][500];
for (int k = 0; k < 10000; ++k) {
for (int i = 0; i < 1000; ++i) {
for (int j = 0; j < 500; ++j) {
a[i][j] = (i + j) * 5416585;
}
}
}
}
}
我的问题 :-
所以,我的问题是我读过的所有内容 C 应该快得多,因为它是低级别的,而 Java 本身在虚拟机上运行,因此应该相对较慢!但就我而言,输出是:-
C:>gcc main.c
C:>javac Main.java
C:>a
time1 : 1610049457
time2 : 1610049468
C:>java Main
time1 : 1610049474
time2 : 1610049478
C:>a
time1 : 1610049487
time2 : 1610049498
C:>java Main
time1 : 1610049501
time2 : 1610049505
显然,Java 在这里比 C 快得多!
为什么会这样?
回答
默认情况下,GCC 不应用任何优化,因此生成的代码非常慢。相比之下,Java VM 默认启用大多数优化。
$ gcc main.c
$ time ./a.out
time1 : 1610050160
time2 : 1610050167
real 0m7.113s
user 0m7.112s
sys 0m0.000s
$ gcc -O2 main.c
$ time ./a.out
time1 : 1610050172
time2 : 1610050172
real 0m0.002s
user 0m0.002s
sys 0m0.000s
如果您查看生成的汇编代码,work则会在优化版本中对函数体进行优化:
work:
.LFB12:
.cfi_startproc
ret
.cfi_endproc
- For comparison, Java without optimization (`java -Xint Main`) runs in 56 seconds on my machine