代码之家  ›  专栏  ›  技术社区  ›  Aillyn

像Jython和JRuby这样的JVM实现怎么能打败它们的本地对应物呢?

  •  4
  • Aillyn  · 技术社区  · 15 年前

    我在看这个视频 here 在这里,Robert Nicholson讨论P8,这是一个在JVM上实现PHP的方法。在某个时候,他提到他们的目标是在将来的某个时候在性能上超越本机PHP。

    他提到了JRuby和Jython,它们开始的速度比它们的本土同行慢,但最终超过了它们。另一个jvm上的php解释器quercus声称 4x faster 比mod_php还重要。

    这是否意味着JVM比C慢的一般观点是错误的,或者原始C实现中是否存在缺陷?

    3 回复  |  直到 15 年前
        1
  •  8
  •   Aiden Bell    15 年前

    这是否意味着JVM比C慢的一般观点是错误的,或者原始C实现中是否存在缺陷?

    二者兼而有之

    JVM已经存在了很长一段时间,并且在效率方面取得了显著的进步。垃圾收集、Jitting、缓存和其他领域比“引用”实现(如PHP)更高级。

    任何一个了解PHP的人都会理解为什么效率提高是容易实现的。

    不过,我个人怀疑JVM能否超越CPython。 …但我可能错了… 是的,这取决于JVM GC的速度更快,还有Ironpython . 性能改进可能是不依赖于C调用堆栈,例如在无堆栈的Python中。 The Jython site states

    Jython大约和CPython一样快——有时快,有时慢。因为大多数JVM——当然是最快的JVM——都是长时间运行的,所以热代码会更快地超时运行。

    我可以这样描述,因为随着缓存的生成,JVM将达到C性能级别,等等,基本上否定了VM实现代码的更高级别方面(其中很大一部分是用C编写的)。

    在许多解释性语言中,如PHP和Python只是等效C调用的桥梁,并深入到机器代码中。在JVM中,抖动通过将字节码减少为等效的机器代码来执行类似的功能。最后,中间的表示,如高级语法和字节码,通常被减少到C-速度或更快的CPU操作无论如何…所以一切都一样,只是 更多中间步骤 这只会影响加载新代码时达到完全效率的延迟。在随机存取存储器中有一个点,你会说“真正的区别是什么?”答案是只有这个过程,以及最终的表示,它决定了堆栈缠绕的速度,垃圾收集算法,寄存器使用和逻辑表示,如算术。

        2
  •  1
  •   Andrew Grimm Alex Wayne    15 年前

    不难。如果用C编写实现,则必须编写自己的GC、JIT等(为了快速高效)。要做到这一点,你需要真正有经验的聪明人,给他们很多时间。

    我将在这里说,当前的PHP实现(不是基于对内部工作的了解,而是基于我所看到的基准以及对PHP了解更多的人告诉我的东西)并不是最先进的。Facebook试图解决这个问题,但他们以一种不寻常的方式解决(因为有特殊的需求和PHP的典型用法,请参见 http://www.stanford.edu/class/ee380/Abstracts/100505.html )

    总结: 因此,如果有人在Java中实现PHP(或者在任何快速VM上),他不需要编写超级GC或JIT来快速地“只”编译器(可以很简单)。

        3
  •  0
  •   Andre Holzner    15 年前

    有一些关于虚拟机做什么的提示 here . 例如,看起来Java虚拟机首先检查字节码的哪些部分被频繁执行,然后将相关的部分编译成本机代码(然后应该以类似的速度执行,例如编译的C代码)。

    顺便问一下,PHP是编译成字节码,还是仅仅使用内存中的数据结构来解释?通过先将PHP翻译成Java虚拟机可执行的字节码,可以自动地从现有的(语言不可知的)字节码执行优化中获益。

    推荐文章