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

fer*_*tar 13 java performance jvm native-code

Java很慢.

这不仅仅是一个"都市传奇",它似乎是一个事实.由于延迟,您不会将其用于实时编码,也不会将其用于群集/并行计算.有数以千计的基准测试,特别是"Java vs C#vs C++".

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

根据上面的网站,不仅Java性能几乎和C一样好(远远不是其他),但Scala和Clojure(两种在JVM上运行的函数语言)都具有比OCaml,Erlang更好的性能.

而且还有很多"Java比X更快"(例如,这里有关于SO的问题:Java运行时性能与原生C/C++代码?).

因此,对于某些情况,Java似乎很快.有人可以解释原因吗?

为什么字节码可能比本机代码运行得更快,在某些情况下,给定动态代码(Scala,Clojure)和垃圾收集?如果速度更快,还有潜伏期怎么样?

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

Edw*_*rzo 11

詹姆斯·戈斯林在书中策划了编程,他解释说:

詹姆斯:没错.这些天我们总是打败真正优秀的C和C++编译器.当你转到动态编译器时,当编译器在最后一刻运行时,你会获得两个优势.一个是你确切知道你正在运行的芯片组.很多时候,当人们编译一段C代码时,他们必须编译它以在通用x86架构上运行.你得到的二进制文件几乎都没有特别适合它们.您下载了Mozilla的最新副本,它几乎可以在任何英特尔架构CPU上运行.几乎有一个Linux二进制文件.它非常通用,它是用GCC编译的,它不是一个非常好的C编译器.

当HotSpot运行时,它确切地知道您正在运行的芯片组.它确切知道缓存的工作原理.它确切地知道内存层次结构如何工作.它确切地知道所有管道互锁在CPU中如何工作.它知道这个芯片有哪些指令集扩展.它可以精确地优化您所使用的机器.然后另一半是它实际上看到应用程序正在运行.它能够获得知道哪些事情很重要的统计数据.它能够内联C编译器永远不会做的事情.在Java世界中内联的东西非常惊人.然后,您将了解存储管理与现代垃圾收集器的工作方式.使用现代垃圾收集器,存储分配非常快.

  • "我们一直在击败真正优秀的C和C++编译器"......"GCC不是一个非常好的C编译器"......"对于现代垃圾收集器,分配速度非常快"......这只是营销和拖钓. (20认同)

Spi*_*nim 9

快速JVM使用即时(JIT)编译.字节码在运行时即时转换为本机代码.JIT提供了许多优化机会.有关JIT的更多信息,请参阅此维基百科文章.