4

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

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

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

4

3 回答 3

8

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

两者都有一点

JVM 已经存在了很长时间,并且在效率上取得了显着的进步。垃圾收集、jitting、缓存和其他领域比 PHP 等“参考”实现更先进。

任何深入了解 PHP 的人都会理解为什么效率提升很容易实现。

然而,我个人怀疑 JVM 能否胜过 CPython ……但我可能是错的……我是,这是因为 JVM GC 更快,而 IronPython 也是如此。性能改进可能是不依赖于 C 调用堆栈,例如在无堆栈 Python 中。Jython 网站指出

Jython 大约与 CPython 一样快——有时更快,有时更慢。因为 > 大多数 JVM(当然是最快的 JVM)长时间运行,热代码会超时运行得更快。

我可以将其视为事实,因为 JVM 将在缓存生成时达到 C 性能水平等等基本上否定了 VM 实现代码的更高级别方面(其中大部分是用 C 编写的)

在许多解释型语言(例如 PHP 和 Python)中,它们只是连接到等效 C 调用并深入机器代码的桥梁。在 JVM 中,Jitter 通过将字节码减少为机器码等价物来执行类似的功能。最终,诸如高级语法和字节码之类的中间表示通常会降低到 C 速度或更快的 CPU 操作……所以都是一样的,只是更多的中间步骤只会影响加载时的延迟到完全效率新代码。在 RAM 中,您会说“真正的区别是什么?” 答案只是到达那里的过程以及决定堆栈缠绕速度、垃圾收集算法、寄存器使用和逻辑表示(如算术)的最终表示。

于 2010-08-15T18:35:13.583 回答
1

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

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

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

于 2010-08-16T01:25:20.243 回答
0

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

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

于 2010-08-15T18:39:31.027 回答