为什么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

以上是为什么C比Java慢得多?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>