我正在观看此视频here,其中Robert Nicholson讨论了J8上的PHP实现P8。在某些时候,他提到他们的目标是在未来的某个时候超越原生PHP的性能。
他提到了JRuby和Jython,它开始时比他们的同类人慢,但最终超过了他们。 Quercus,JVM上的另一个PHP解释器声称是4x faster而不是mod_php,值得注意。
这是否意味着JVM比C慢的一般想法是错误的,或者原始C实现中是否存在缺陷?
答案 0 :(得分:8)
这是否意味着JVM比C慢的一般想法是错误的,或者原始C实现中是否存在>缺陷?
两者兼而有之
JVM已经存在了很长时间,并且在效率方面取得了重大进展。垃圾收集,jitting,缓存和其他领域比PHP中的“参考”实现更先进。
任何看过PHP的人都会理解为什么很容易实现效率提升。
我个人怀疑JVM可以胜过CPython但是 ...但我可能错了...... 我是,这是由于JVM GC速度更快,而且IronPython也是。性能改进可能是不依赖于C调用堆栈,例如无堆栈Python。 The Jython site states
Jython与CPython差不多 - 有时更快,有时更慢。因为>大多数JVM - 当然是最快的 - 长时间运行,热代码会超时运行。
我可以将其视为事实,因为JVM将在缓存生成时达到C性能级别,因此基本上否定了VM实现代码的更高级别方面(其中很大一部分是用C编写的)
在许多解释性语言中,例如PHP和Python,它们只是等效C调用和潜入机器代码的桥梁。在JVM中,抖动通过将字节码减少为机器代码等价物来执行类似的功能。最终,高级语法和字节码之类的中间表示通常会降低到C速度或更快的CPU操作......所以它完全相同,只是更多中间步骤加载新代码时的完全效率延迟。在RAM中有一点你说“真正的区别是什么?”答案只是获取它的过程以及确定堆栈缠绕速度,垃圾收集算法,寄存器使用和逻辑表示(如算术)的最终表示。
答案 1 :(得分:1)
这不是太难。如果用C编写实现,则必须编写自己的GC,JIT等(快速高效)。要做到这一点真的很好,你需要有很多经验的聪明人,给他们很多时间。
我将在这里说明当前PHP的实现(不是基于内部工作的知识,而是基于我所看到的基准测试以及对PHP知识更多的人告诉我的事情)不是最先进的。 Facebook试图解决这个问题,但他们以一种不寻常的方式做到这一点(因为有特殊需求和PHP的典型用法见http://www.stanford.edu/class/ee380/Abstracts/100505.html)。
<强>要点:强> 因此,如果某人在java(或任何快速VM)中实现PHP,他不需要编写超级GC或JIT来快速“仅”编译器(这可能很简单)。
答案 2 :(得分:0)
关于虚拟机的作用here,有一些提示。例如,看起来Java虚拟机首先检查字节码的哪些部分最常执行,然后将相关部分编译成本机代码(然后应该以与编译的C代码类似的速度执行)。
顺便说一句,PHP是否编译成字节码,还是仅使用内存数据结构进行解释?通过将PHP首先转换为Java虚拟机可执行的字节码,可以从现有的(语言无关的)字节码执行优化中自动获益。