【问题标题】:How can JVM implementations like Jython and JRuby beat their native counterparts?像 Jython 和 JRuby 这样的 JVM 实现如何能够击败它们的本地同行?
【发布时间】:2010-08-15 18:28:55
【问题描述】:

我正在观看此视频here,其中 Robert Nicholson 讨论了 P8,这是 JVM 上的 PHP 实现。在某些时候,他提到他们的目标是在未来某个时候在性能上超越原生 PHP。

他提到了 JRuby 和 Jython,它们开始时比它们的本地同行慢,但最终超过了它们。 Quercus 是 JVM 上的另一个 PHP 解释器,它声称是 4x faster 而不是 mod_php,也值得注意。

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

【问题讨论】:

    标签: performance jvm jruby jython quercus


    【解决方案1】:

    这是否意味着 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 中,Jitter 通过将字节码减少为机器码等价物来执行类似的功能。最终,诸如高级语法和字节码之类的中间表示通常会降低到 C 速度或更快的 CPU 操作……所以都是一样的,只是 更多中间步骤 只会影响加载新代码时达到完全效率的延迟。在 RAM 中,您会说“真正的区别是什么?”答案只是到达那里的过程以及决定堆栈缠绕速度、垃圾收集算法、寄存器使用和诸如算术之类的逻辑表示的最终表示。

    【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      顺便说一句,PHP 是编译成字节码还是只是使用内存数据结构解释?通过首先将 PHP 转换为 Java 虚拟机可执行的字节码,可以自动受益于现有的(与语言无关的)字节码执行优化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-22
        • 1970-01-01
        • 2015-07-30
        相关资源
        最近更新 更多