4 回答
TA贡献1806条经验 获得超5个赞
添加一些分析/时间测量来确定。例如,在代码中添加一个计时器,以测量 main 运行需要多长时间。并多次运行测试,因为进程的 CPU 时间在执行之间可能会有很大差异(因为操作系统正在执行其他操作等)
C 程序被编译为本机机器代码,与汇编密切相关。这意味着,程序(几乎)被编译为 CPU 已经知道如何执行的单独指令。
Java 程序通常被编译为中间字节码,而不是本机机器代码。CPU(很可能)不知道如何运行这些指令。运行Java程序需要启动JVM,JVM会将这些字节码指令翻译为本机机器代码,然后由CPU执行。加载 JVM 和翻译代码的这一步需要额外的时间,这超出了“主”函数运行的时间。
还需要考虑的是,Java 有一个垃圾收集器,除其他外,它可以防止资源泄漏。C 缺乏这一点,这意味着你必须自己管理资源。Java 垃圾收集器也需要时间来启动,并且在执行期间可能会产生 CPU 时间开销,具体取决于程序。
这里还有其他低级别和高级别的考虑因素,但这只是对于初学者来说......
TA贡献1831条经验 获得超4个赞
因为Java程序(实际上是编译后的二进制文件,又名字节码)运行在名为JVM的虚拟机之上,而本机二进制文件(例如,用你的措辞来说,C程序)运行在裸机上。JVM 将做相当多的工作来使虚拟“指令”能够运行裸机,例如,解释为原始且幼稚的实现,JIT 作为更复杂的措施。此外,当您的应用程序内存分配密集时,称为垃圾收集(GC)的自动内存管理机制将显着减慢虚拟机的速度。
TA贡献1788条经验 获得超4个赞
另一个可能的原因是,当您启动时,java
您需要将所有运行时加载到内存中。
也许尝试检测您的代码来测量代码的实际运行时间,而不是整个命令的执行时间,您可能会看到不同的结果。
C 可能仍然会更快,因为 Java 字节码是在开始时解释的。然而,对于很长的循环,有时,即时 (JIT) 编译器可能会启动,并且性能可能会变得与编译语言相似。
Java 有时比 C 更快的其他原因是:在动态分配大量数据结构的程序中,Java 的垃圾收集器通常会将整批对象收集在一起,从而优化释放内存所需的时间。另一方面,在 C 中,您必须free
手动调用,一次销毁一个对象。这既是一件好事,因为你可以控制它何时发生,也是一件坏事,因为必须提出我提到的那种优化(自动垃圾收集也很好,因为无论如何它都会防止许多内存泄漏)。
TA贡献1829条经验 获得超9个赞
几个原因:
编译的 C 代码(通常)在本机运行,而编译的 Java 代码(通常)在虚拟机(基本上是机器代码级解释器)中运行 - 在所有条件相同的情况下,本机代码将比 VM 中的代码运行得更快;
编译的 Java 代码执行许多编译的 C 代码不执行的运行时检查(数组边界检查、空指针检查等);
Java 虚拟机对不再使用的堆分配对象执行定期垃圾收集 - C 根本不执行任何类型的自动内存管理;
添加回答
举报