8

为什么与 Python 等其他解释型语言相比,Java 的性能要好得多?我知道这可能与它预先编译的事实有关,但是并发呢?

JVM 是如何在并发程序上表现得更好,而解释语言必须处理诸如全局解释器锁定之类的事情,这真的会减慢速度?

4

2 回答 2

11

这是一个非常有趣的问题,但我不确定是否有简单的方法来回答它。如今,JVM 使用一系列高度激进的优化来尝试提高性能。这里有几个:

  • 动态编译:大多数优秀的 JVM 可以将字节码直接动态编译成机器码,然后以本机速度执行。
  • 多态内联缓存:许多 JVM 使用内联缓存来尝试通过记住过去调用过哪些函数来提高方法分派的性能。
  • 静态类型:由于 Java 是静态类型的,字节码指令很少需要对对象的类型进行昂贵的自省以确定如何对其执行操作。可以静态计算字段偏移量,也可以预先计算虚函数表中的方法索引。相比之下,JavaScript 等语言没有静态类型并且更难解释。
  • 垃圾收集: JVM 垃圾收集器经过优化,可以有效地分配和释放对象。它结合了标记和清除和停止和复制技术来使大多数分配非常快,并且可以很容易地快速回收大量内存。
  • 已知的阻塞点:一些 JVM 实现不是拥有巨大的 VM 锁,而是自动将额外的代码插入到每段已编译/解释的代码中,以定期检查 VM 并确定它们是否可以继续运行。这样,如果 JVM 只需要在几个线程中进行垃圾收集,它就可以在其他线程运行时这样做。如果它需要执行 stop-the-world 操作,它只会在线程到达特定点时发生,这意味着简单的操作不必不断地检查 VM 状态。

还有很多很多我可能不知道的优化,但我希望这可以帮助您找到答案!

于 2013-06-10T20:41:07.807 回答
3

Java 代码在编译期间几乎没有优化。

运行时 JIT 执行大部分编译。

Java的不同之处在于它的功能相对较差,副作用最小。这使得代码更容易优化。

而解释语言必须处理诸如全局解释器锁定等问题,这真的会减慢速度吗?

这是一个实施问题。Java 从一开始就被设计为支持多线程。我怀疑 python 是为编写脚本和快速开发周期而设计的,因此它做得更好。

于 2013-06-10T20:39:00.493 回答