为什么Java程序的执行时间比C语言中的相同程序要长?

所以我有两个程序做同样的事情,一个用 C 编写,另一个用 Java 编写。它们都创建 50 个线程并等待所有线程完成,然后终止。

为了了解两个程序之间的时间差,我在 Linux 中使用“time”命令来获取执行时间。

对于 C 程序,总执行时间为 0.020 秒,而 Java 版本则需要 0.663 秒才能完成。

我尝试寻找答案,但我发现的只是一些文章,例如( 两篇)说 Java 实际上比 C 更快,我认为这是无稽之谈,所以如果有人能为我澄清这一点,我将非常感激。

谢谢。

这就是 C 代码的样子。

#include<stdio.h>

#include<pthread.h>

#include<unistd.h>

#define N 50


void* tproc(void *arg) {

    printf("Thread %d\n", *((int *) arg));

    return NULL;

}


int main(int argc, char * argv[]) {

    int i;

    int targ[N];

    pthread_t tid[N];

    for(i = 0; i < N; i++) {

    targ[i] = i;

        if(pthread_create(&(tid[i]), NULL, &tproc, &targ[i]) != 0) {

            printf("Can't create thread %d\n", i);

            return 1;

        }

    }

    for(i = 0; i < N; i++) {

        if(pthread_join(tid[i], NULL) != 0) {

            printf("Can't join thread %d\n", i);

        }

    }

    return 0;

}

这就是 Java 代码的样子。


import java.util.concurrent.*;


class MyThread extends Thread {


    static final int N = 50 ;

    int arg;


    public MyThread(int arg) {

        this.arg = arg;

    }


    public void run() {

       System.out.println("Thread " + arg);

    }


    public static void main(String [] args) {

        MyThread[] tid = new MyThread [N] ;

        for(int i = N-1; i >= 0; i--) {

            tid[i] = new MyThread(i);

            tid[i].start();

        }

        for(int i = 0; i < N; i++) {

            try { tid[i].join(); }

            catch(InterruptedException e) { }

        }

    }

}


holdtom
浏览 152回答 4
4回答

忽然笑

添加一些分析/时间测量来确定。例如,在代码中添加一个计时器,以测量 main 运行需要多长时间。并多次运行测试,因为进程的 CPU 时间在执行之间可能会有很大差异(因为操作系统正在执行其他操作等)C 程序被编译为本机机器代码,与汇编密切相关。这意味着,程序(几乎)被编译为 CPU 已经知道如何执行的单独指令。Java 程序通常被编译为中间字节码,而不是本机机器代码。CPU(很可能)不知道如何运行这些指令。运行Java程序需要启动JVM,JVM会将这些字节码指令翻译为本机机器代码,然后由CPU执行。加载 JVM 和翻译代码的这一步需要额外的时间,这超出了“主”函数运行的时间。还需要考虑的是,Java 有一个垃圾收集器,除其他外,它可以防止资源泄漏。C 缺乏这一点,这意味着你必须自己管理资源。Java 垃圾收集器也需要时间来启动,并且在执行期间可能会产生 CPU 时间开销,具体取决于程序。这里还有其他低级别和高级别的考虑因素,但这只是对于初学者来说......

慕容708150

因为Java程序(实际上是编译后的二进制文件,又名字节码)运行在名为JVM的虚拟机之上,而本机二进制文件(例如,用你的措辞来说,C程序)运行在裸机上。JVM 将做相当多的工作来使虚拟“指令”能够运行裸机,例如,解释为原始且幼稚的实现,JIT 作为更复杂的措施。此外,当您的应用程序内存分配密集时,称为垃圾收集(GC)的自动内存管理机制将显着减慢虚拟机的速度。

尚方宝剑之说

另一个可能的原因是,当您启动时,java您需要将所有运行时加载到内存中。也许尝试检测您的代码来测量代码的实际运行时间,而不是整个命令的执行时间,您可能会看到不同的结果。C 可能仍然会更快,因为 Java 字节码是在开始时解释的。然而,对于很长的循环,有时,即时 (JIT) 编译器可能会启动,并且性能可能会变得与编译语言相似。Java 有时比 C 更快的其他原因是:在动态分配大量数据结构的程序中,Java 的垃圾收集器通常会将整批对象收集在一起,从而优化释放内存所需的时间。另一方面,在 C 中,您必须free手动调用,一次销毁一个对象。这既是一件好事,因为你可以控制它何时发生,也是一件坏事,因为必须提出我提到的那种优化(自动垃圾收集也很好,因为无论如何它都会防止许多内存泄漏)。

PIPIONE

几个原因:编译的 C 代码(通常)在本机运行,而编译的 Java 代码(通常)在虚拟机(基本上是机器代码级解释器)中运行 - 在所有条件相同的情况下,本机代码将比 VM 中的代码运行得更快;编译的 Java 代码执行许多编译的 C 代码不执行的运行时检查(数组边界检查、空指针检查等);Java 虚拟机对不再使用的堆分配对象执行定期垃圾收集 - C 根本不执行任何类型的自动内存管理;
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java