一直以来,大家都在讨论 PHP 8 中是否会支持 JIT(Just-In-Time)即时编译执行功能,最新消息是官方已经确认将其引入。
Include JIT into PHP 8? | ||
---|---|---|
Real name | Yes | No |
ab (ab) | ![]() |
|
ashnazg (ashnazg) | ![]() |
|
beberlei (beberlei) | ![]() |
|
brandon (brandon) | ![]() |
|
bwoebi (bwoebi) | ![]() |
|
carusogabriel (carusogabriel) | ![]() |
|
cmb (cmb) | ![]() |
|
cpriest (cpriest) | ![]() |
|
dams (dams) | ![]() |
|
danack (danack) | ![]() |
|
derick (derick) | ![]() |
|
diegopires (diegopires) | ![]() |
|
dmitry (dmitry) | ![]() |
|
duncan3dc (duncan3dc) | ![]() |
|
emir (emir) | ![]() |
|
galvao (galvao) | ![]() |
|
guilhermeblanco (guilhermeblanco) | ![]() |
|
jhdxr (jhdxr) | ![]() |
|
jmikola (jmikola) | ![]() |
|
jpauli (jpauli) | ![]() |
|
jwage (jwage) | ![]() |
|
kalle (kalle) | ![]() |
|
klaussilveira (klaussilveira) | ![]() |
|
krakjoe (krakjoe) | ![]() |
|
laruence (laruence) | ![]() |
|
lcobucci (lcobucci) | ![]() |
|
levim (levim) | ![]() |
|
malukenho (malukenho) | ![]() |
|
mariano (mariano) | ![]() |
|
mbeccati (mbeccati) | ![]() |
|
mike (mike) | ![]() |
|
narf (narf) | ![]() |
|
neeke (neeke) | ![]() |
|
nikic (nikic) | ![]() |
|
ocramius (ocramius) | ![]() |
|
pajoye (pajoye) | ![]() |
|
peehaa (peehaa) | ![]() |
|
petk (petk) | ![]() |
|
pmmaga (pmmaga) | ![]() |
|
pollita (pollita) | ![]() |
|
remi (remi) | ![]() |
|
reywob (reywob) | ![]() |
|
rtheunissen (rtheunissen) | ![]() |
|
salathe (salathe) | ![]() |
|
sammyk (sammyk) | ![]() |
|
stas (stas) | ![]() |
|
svpernova09 (svpernova09) | ![]() |
|
tianfenghan (tianfenghan) | ![]() |
|
wjx (wjx) | ![]() |
|
yunosh (yunosh) | ![]() |
|
zeev (zeev) | ![]() |
|
zimt (zimt) | ![]() |
|
Final result: | 50 | 2 |
PHP 实现了一个虚拟机 Zend VM,它会将人类可读脚本编译成虚拟机理解的指令,也就是操作码,这个执行阶段就是“编译时(Compile Time)”。在“运行时(Runtime)”执行阶段,虚拟机 Zend VM 会执行这些编译好的操作码。
通常编译时与运行时两个阶段是独立分开的,脚本编译完成后,像 APC 与 OPCache 这样的字节码缓存组件会缓存这些操作码。而 JIT 去掉了编译时阶段,它将这编译时与运行时两个阶段合为一体,实现即时编译与执行。
JIT 是一种编译器策略,它将代码表述为一种中间状态,在运行时将其转换为依赖于体系结构的机器码,并即时执行。在 PHP 中,这意味着 JIT 将为 Zend VM 生成的指令视为中间表述,并以依赖于体系结构的机器码执行,也就是说托管代码的不再是 Zend VM,而是更为底层的 CPU。
虽然自 PHP 7.0 以来,通过优化核心数据结构 HashTable、强化 Zend VM 中某些操作码与持续改进 OPCache 的 Optimizer 组件等具体措施,PHP 性能得到了显著提升,但是实际上这些优化似乎已经走到极限了。现在 JIT 从底层着手,被认为是目前提升 PHP 性能的最佳出路。
关于是否引入 JIT 的官方投票结果已于近日公布,因为大部分核心开发者投了赞成票,所以 PHP 8 中将会支持 JIT。
另外值得一提的是,PHP JIT 对于使用 PHP 的网站来说提速可能并不明显,因为 JIT 在 CPU 密集型的代码上效果最好,而一般情况下,用 PHP 编写的程序都是 I/O 密集型的。简单来说就是,PHP 程序往往受限于 I/O 而不是 CPU,使 PHP 代码运行速度变慢的因素往往是它们正在执行的 I/O 操作,包括连接、读取和写入数据库、高速缓存、文件与套接字等。
PHP 中 CPU 密集型代码的一个例子是 Zend/bench.php。
那么 PHP 中的 JIT 将会在哪里发挥作用呢?答案是数学领域。关于 PHP JIT 的详细介绍,可以查看:https://blog.krakjoe.ninja/2019/03/php-gr8.html
引用来自“左华栋”的评论
说重点吧,一是php 最大的性能瓶颈在于IO模型,不论是异步非阻塞IO还是协程都能解决,但是不兼容php现有生态,其他的解决办法比如swoole 。二是 8的发布时间是2021年,凉透了。。。
然而我在Swoole中还不是可以composer安装PHPOffice和PHPMailer这些库来用.
本质上,只要兼容PHP-CLI模式的PHP程序和库,就可以跑在Swoole上.
Swoole应用本质也不过是个PHP-CLI应用,只不过多了更多支持异步协程编程的API,仅此而已.
然加PHP JIT作者说得很清楚,JIT对PHP实际应用性能提升不大,对bench.php这种计算密集型应用,才有明显效果.
所以,可拔插的JIT完全是锦上添花,所以PHP8什么时候发布并不重要,虽然PHP7.4也可以使用体验版JIT.
PHP 7.4在bench.php测试中,启用JIT时耗时不到禁用JIT时的一半,也就是计算性能提升了一倍多.
要显著提升PHP Web服务性能,PHP7+Swoole已经足够.
https://www.techempower.com/benchmarks/
PHP7+Swoole在TechEmpower默认的Fortunes测试中排名第4(前3依次是C/Java/Go).
引用来自“lcccd”的评论
投反对票的都不玩了Include JIT into PHP 8? (50人赞成,2人反对)
Include JIT into PHP 7.4 (experimental)? (18人赞成,36人反对)
其中鸟哥laruence,JIT核心开发者dmitry,PHP之父rasmus,Zend公司创始人zeev,在两项投票中都投了赞成.
二是 8的发布时间是2021年,凉透了。。。