当前位置: 首页 > 面试题库 >

为什么字节码可能比本机代码运行得更快?

杨曜瑞
2023-03-14
问题内容

Java很慢。

这似乎不仅仅是一个“城市传奇”。由于延迟,您不将其用于实时编码,也不将其用于集群/并行计算。有成千上万的基准测试,特别是“ Java vs C#vs C
++”。

http://benchmarksgame.alioth.debian.org/

根据以上站点,不仅Java性能几乎与C一样好(远远没有C),而且Scala和Clojure(两种在JVM上运行的功能语言)都具有比OCaml和Erlang更好的性能。

而且那里也有很多“ Java比X更快”。

因此,在某些情况下,Java似乎很快。有人可以解释为什么吗?

为什么在给定动态代码(Scala,Clojure)和垃圾回收的情况下,字节码为什么运行得比本地代码快?如果速度更快,仍然存在延迟,那怎么办呢?

这似乎是一个矛盾,有人可以阐明吗?


问题答案:

James Gosling在编程大师中解释了以下内容:

詹姆斯 :好的。这些天,我们几乎总是在击败真正优秀的C和C
++编译器。当使用动态编译器时,当编译器在最后一刻正确运行时,您将获得两个好处。一是您确切知道要运行的芯片组。人们多次编译一段C代码时,必须将其编译为在通用x86架构上运行。您获得的二进制文件中几乎没有一个经过特别优化。您下载了Mozilla的最新副本,它几乎可以在任何英特尔架构CPU上运行。几乎有一个Linux二进制文件。它非常通用,并且是用GCC编译的,而GCC并不是很好的C编译器。

当HotSpot运行时,它确切知道您正在运行的芯片组。它确切知道缓存的工作方式。它确切知道内存层次结构是如何工作的。它确切地知道所有管线互锁在CPU中的工作方式。它知道该芯片具有哪些指令集扩展。它针对您正在使用的机器进行了优化。然后另一半是它实际上在运行时看到了该应用程序。它能够拥有知道哪些事情很重要的统计信息。它能够内联C编译器无法执行的操作。内联到Java世界中的东西真是太神奇了。然后,您可以确定存储管理与现代垃圾收集器一起工作的方式。使用现代垃圾收集器,存储分配非常快。



 类似资料:
  • 问题内容: 看起来您可以用字节码做的任何事情,都可以像使用本机代码一样轻松快捷地完成。从理论上讲,您甚至可以通过以字节码分发程序和库,然后在安装时编译为本地代码,而不是JIT来保持平台和语言的独立性。 因此,通常来说,什么时候您要执行字节码而不是本机? 问题答案: SGI的Hank Shiffman说(很久以前,但这是事实): Java使用字节码而不是使用系统的本机代码具有三个优点: 可移植性 :

  • 问题内容: 看起来您可以使用字节码执行的任何操作都可以像使用本机代码一样轻松,更快地完成。从理论上讲,您甚至可以通过以字节码分发程序和库,然后在安装时编译为本机代码,而不是JIT来保持平台和语言的独立性。 因此,通常来说,什么时候您要执行字节码而不是本机? 问题答案: SGI的Hank Shiffman说(很久以前,但这是事实): Java使用字节码而不是使用系统的本机代码具有三个优点: 可移植性

  • 我写了一些欧拉问题35的代码: 我想知道为什么这个代码(上图)运行得这么快,当我设置在函数中。这段代码的运行时间约为8秒。最初,我没有设置,我的函数是这样的: 我的初始代码(没有)运行了很长时间,我没有等它完成。我很好奇,为什么这两段代码在运行时间上存在如此大的差异,因为我不相信会有任何重复项,这会使迭代花费如此长的时间,以至于迭代。也许我对set()的想法是错误的。欢迎任何帮助。

  • 问题内容: 我编写了两种方法的代码,以找出LeetCode字符串中的第一个唯一字符。 问题陈述: 给定一个字符串,找到其中的第一个非重复字符并返回其索引。如果不存在,则返回-1。 示例测试用例: s =“ leetcode”返回0。 s =“ loveleetcode”,返回2。 方法1(O(n))(如果我错了,请纠正我): 方法2(O(n ^ 2)): 在方法2中,我认为复杂度应为O(n ^ 2

  • 60次迭代的结果是: 这次测试的结果是一致的。无论我在操作方法中对for循环进行了多少次迭代,异步程序的运行速度都比非异步程序慢1秒左右。(我连续多次运行测试,以解释抖动升温的原因。)我做错了什么,导致异步比非异步慢?我是否误解了编写异步代码的基本原理?