php8的性能竟比php7.4提升了接近一倍

php8的性能竟比php7.4提升了接近一倍

php终于支持jit了,而1996年java已经支持jit

php8.0 默认情况下 和php7.4性能基本接近,但是开启jit后 在cpu密集计算的情况下可以提升92%左右的性能,比php5 性能提升5-7倍

PHP 8 的 JIT(Just In Time)编译器将作为扩展集成到 php 中 Opcache 扩展 用于运行时将某些操作码直接转换为从 cpu 指令,大概来说就是之前版本的Opcache 可以跳过编译解释直接机器码到zend,而jit跳过zend 直接到cpu指令 。PHP 的 JIT 使用了名为** DynASM (Dynamic Assembler) 的库**,该库将一种特定格式的一组 CPU 指令映射为许多不同 CPU 类型的汇编代码。 因此,编译器只需要使用 DynASM 就可以将 Opcodes 转换为特定结构体的机器码。

JIT编译原理

1、检查opcodes是否缓存

2、zend compiler编译器进行编译生成opcodes

3、optimizer优化器生成优化后的opcodes

4、把优化后的opcodes放入opcodes cache缓存

5、jit编译器把optimized opcodes再次编译成汇编机器码machine codes

6、进入zend vm虚拟前先检查是否开启jit引擎

7、如果已经开启了jit引擎则直接读取机器码中的jit buffer代码片段

8、送入x86 cpu架构进行执行

其他要明白的

1、Opcache会做opcode层面的优化,比如图中的两条opcode合并为一条

2、PHP8的JIT目前是在Opcache之中提供的

3、JIT在Opcache优化之后的基础上,结合Runtime的信息再次优化,直接生成机器码

4、JIT不是原来Opcache优化的替代,是增强

5、目前PHP8只支持x86架构的CPU arm还要等着

当然如果php只是处理一些io操作,那么你用php5 还是php8 都差不多,因为性能瓶颈在io上而不是cpu上。如果是IO 密集型操作的 应用,开启jit反而可能会有10%左右的性能消耗 ,尤其是Laravel。

在密集计算的情况下,对比php7.4 和 未开机jit的php8 性能提升差不多是92%-120% ,也就是1倍左右。

当然 即便是开启了 jit,在密集计算上,php的性能依旧被 node.js java C# go C++ 吊打

至于为什么使用php 这个各取所需的话题没啥可说的 所以还是尽快升级到php8

刚刚在宝塔中查看,已经支持到8.1.9 性能再提升4%左右 新项目不用考虑 直接上了。

在php.ini 中看到

opcache.jit_buffer_size=128m
opcache.jit=1205

宝塔默认帮开启了,opcache.jit这个配置由4个独立的数字组成,分别代表

是否使用AVX指令 寄存器分配策略 JIT触发策略 JIT优化策略 具体查看php8手册

值得注意的时php8.1.9下 部分扩展可能尚未支持

libssh2 【依赖关系如下:PECL/ssh2 –> libssh2 –> openssl】

sg11

常用的扩展 swoole redis之类的肯定都是没问题的

最终使用一段时间后,发现jit虽然提升了性能,但是再io频繁的情况下,没有任何感觉

php8 虽然已经很不错了,但是依旧是吃性能离谱,考虑到每日的用户暴涨和服务器费用,最终选择用golang重写,彻底抛弃php

以后 加上本博客最近也从wordpress 迁移到了 vuepress静态生成,以后用php的地方 可能就只是几个小动态页和maccms看看电影了

Licensed under CC BY-NC-SA 4.0
最后更新于 2022-09-07 19:56 UTC
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计