PHP8新增功能介绍

PHP8引入了JIT编译技术,大幅提高代码执行速度,尤其是CPU密集型计算。此外,还新增了命名参数、联合类型、match表达式、构造器属性提升、注解和Nullsafe运算符等功能,改进了类型系统和语法一致性,带来了更高效的开发体验。
摘要由CSDN通过智能技术生成

万众期待的世界上最好的编程语言——PHP,最新版PHP8在2020-11-26正式版发布了。

它包含了很多新功能与优化项, 包括命名参数、联合类型、注解、构造器属性提升、match 表达式、nullsafe 运算符、JIT,并改进了类型系统、错误处理、语法一致性。

今天来具体分析些这些主要的新的更新点:

1. JIT编译 (Just In Time Compilation)

JIT算是PHP最值得期待的一个功能了,JIT编译技术,它通过将OpCodes编译为机器码,进一步提高了代码的执行速度。对于 CPU 密集型计算,性能有显著的提升。

下面这张图是一个对比,在开启了JIT后的性能对比,性能的提升可以说是非常的明显的。

在这里插入图片描述

上面说到,JIT是基于OpCodes的,那么就简单的分析下PHP执行的原理:

1. 不开启Opcache

在不开启Opcache时,PHP代码执行的步骤:
在这里插入图片描述

执行PHP代码,分别是以下4步:

  1. Lexing,将PHP代码转换为语言片段(Tokens)
  2. Parsing, 将Tokens转换成简单而有意义的抽象语法树表达式
  3. Compilation,将表达式编译成Opcodes
  4. Execution,Zend引擎顺次执行Opcodes

2. 开启Opcacheh后的执行过程

在这里插入图片描述

Opcache开启后,它通过添加一个内存共享缓存层,将编译后的Opcodes缓存起来,下次执行相同的代码的时候,直接取出给到zend VM引擎去执行。

这样就省去了 Lexing 、 Parsing 和 Compiling 这3个步骤,加快了程序的执行速度。

3. 开启JIT后的执行过程

在这里插入图片描述

开启JIT支持后,JIT在Opcache优化之后的基础上,结合Runtime的信息再次优化,直接生成机器码并进行缓存。下次执行相同的代码的时候,将直接从缓存中取出机器码进行执行。

这样,把Zend VM引擎去执行Opcodes生成机器码这一步也给省去了。

4. JIT的配置。

JIT是在opcache的基础之上的,所以得先在php.ini中开启opcode:

zend_extension = opcache.so 
opcache.enable = 1 
opcache.enable_cli = 1

然后就是JIT自己的配置了:

opcache.jit=1205
opcache.jit_buffer_size=64M

opcache.jit 1205 这4个数字由4个配置项组成

1,是否在生成机器码点时候使用AVX指令, 需要CPU支持: (0,1)
2,寄存器分配策略:(0~2)
3,JIT触发策略:(0~5)
4,JIT优化策略,数值越大优化力度越大: (0~5)

其中这4项的具体值说明如下:

是否在生成机器码点时候使用AVX指令, 需要CPU支持:
0: 不使用
1: 使用

寄存器分配策略:
0: 不使用寄存器分配
1: 局部(block)域分配
2: 全局(function)域分配

JIT触发策略:
0: PHP脚本载入的时候就JIT
1: 当函数第一次被执行时JIT
2: 在一次运行后,JIT调用次数最多的百分之(opcache.prof_threshold * 100)的函数
3: 当函数/方法执行超过N(N和opcache.jit_hot_func相关)次以后JIT
4: 当函数方法的注释中含有@jit的时候对它进行JIT
5: 当一个Trace执行超过N次(和opcache.jit_hot_loop, jit_hot_return等有关)以后JIT

JIT优化策略,数值越大优化力度越大:
0: 不JIT
1: 做opline之间的跳转部分的JIT
2: 内敛opcode handler调用
3: 基于类型推断做函数级别的JIT
4: 基于类型推断,过程调用图做函数级别JIT
5: 基于类型推断,过程调用图做脚本级别的JIT

看上去比较复杂,总结一下就是:

尽量使用12x5型的配置,此时应该是效果最优的。对于x, 如果是脚本级别的,推荐使用0,如果是Web服务型的,可以根据测试结果选择3或5

5. 性能对比

我们分别在php7和php8下面,去执行相同的测试代码,看下性能对比情况

PHP7:

$ php -d opcache.jit_buffer_size=0 Zend/bench.php

simple             0.006
simplecall         0.003
simpleucall        0.003
simpleudcall       0.003
mandel             0.023
mandel2            0.036
ackermann(7)       0.012
ary(50000)         0.003
ary2(50000)        0.002
ary3(2000)         0.029
fibo(30)           0.045
hash1(50000)       0.006
hash2(500)         0.007
heapsort(20000)    0.017
matrix(20)         0.015
nestedloop(12)     0.014
sieve(30)          0.008
strcat(200000)     0.003
------------------------
Total              0.236

PHP8:

php -d opcache.jit_buffer_size=64M -d opcache.jit=1205 Zend/bench.php

simple 0.002
simple             0.001
simplecall         0.000
simpleucall        0.001
simpleudcall       0.000
mandel             0.005
mandel2            0.006
ackermann(7)       0.006
ary(50000)         0.002
ary2(50000)        0.002
ary3(2000)         0.010
fibo(30)           0.019
hash1(50000)       0.004
hash2(500)         0.003
heapsort(20000)    0.008
matrix(20)         0.008
nestedloop(12)     0.005
sieve(30)          0.002
strcat(200000)     0.002
------------------------
Total              0.085

对比下来:对于Zend/bench.php

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值