PHP8 alpha1已经在昨天发布,相信关于JIT是大家最关心的,它到底怎么用,有什么要注意的,以及性能提升到底咋样?

首先,我们来看一张图:

左图是 PHP 8之前的Opcache流程示意图, 右图是 PHP 8中的Opcache示意图, 可以看出几个关键点:

PHP8的JIT是在Opcache之中提供的

目前PHP8只支持x86架构的CPU

JIT是在原来Opcache优化的优化基础之上进行优化的,不是替代

事实上JIT共用了很多原来Opcache做优化的基础数据结构,比如data flow graph, call graph, SSA等,关于这部分,后续如果有时间,可以单独在写一个文章来介绍,今天就只是着重在使用层面。

下载安装好以后,除掉原有的opcache配置以外,对于JIT我们需要添加如下配置到php.ini:

opcache.jit=1205

opcache.jit_buffer_size=64M

opcache.jit这个配置看起来稍微有点复杂,我来解释下, 这个配置由4个独立的数字组成,从左到右分别是( 请注意,这个是基于目前alpha1的版本设置,一些配置可能会随着后续版本做微调 ):

是否在生成机器码点时候使用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

@jit的形式,在有了attributes以后,可能变为<>

现在,我们来测试下启用和不启用JIT的时候,Zend/bench.php的差异,首先是不启用(php -d opcache.jit_buffer_size=0 Zend/bench.php):

simple 0.008

simplecall 0.004

simpleucall 0.004

simpleudcall 0.004

mandel 0.035

mandel2 0.055

ackermann(7) 0.020

ary(50000) 0.004

ary2(50000) 0.003

ary3(2000) 0.048

fibo(30) 0.084

hash1(50000) 0.013

hash2(500) 0.010

heapsort(20000) 0.027

matrix(20) 0.026

nestedloop(12) 0.023

sieve(30) 0.013

strcat(200000) 0.006

------------------------

Total 0.387

根据上面的介绍,我们选择opcache.jit=1205, 因为bench.php是脚本(php -d opcache.jit_buffer_size=64M -d opcache.jit=1205 Zend/bench.php):

simple 0.002

simplecall 0.001

simpleucall 0.001

simpleudcall 0.001

mandel 0.010

mandel2 0.011

ackermann(7) 0.010

ary(50000) 0.003

ary2(50000) 0.002

ary3(2000) 0.018

fibo(30) 0.031

hash1(50000) 0.011

hash2(500) 0.008

heapsort(20000) 0.014

matrix(20) 0.015

nestedloop(12) 0.011

sieve(30) 0.005

strcat(200000) 0.004

------------------------

Total 0.157

可见, 对于Zend/bench.php, 相比不开启JIT,开启了以后,耗时降低将近60%,性能提升将近2倍 。

对于大家研究学习来说,可以通过opcache.jit_debug来观测JIT后生成的汇编结果,比如对于:

function simple() {

$a = 0;

for ($i = 0; $i < 1000000; $i++)

$a++;

}

我们通过php -d opcache.jit=1205 -dopcache.jit_debug=0x01 可以看到:

JIT$simple: ; (/tmp/1.php)

sub $0x10, %rsp

xor %rdx, %rdx

jmp .L2

.L1:

add $0x1, %rdx

.L2:

cmp $0x0, EG(vm_interrupt)

jnz .L4

cmp $0xf4240, %rdx

jl .L1

mov 0x10(%r14), %rcx

test %rcx, %rcx

jz .L3

mov $0x1, 0x8(%rcx)

.L3:

mov 0x30(%r14), %rax

mov %rax, EG(current_execute_data)

mov 0x28(%r14), %edi

test $0x9e0000, %edi

jnz JIT$$leave_function

mov %r14, EG(vm_stack_top)

mov 0x30(%r14), %r14

cmp $0x0, EG(exception)

mov (%r14), %r15

jnz JIT$$leave_throw

add $0x20, %r15

add $0x10, %rsp

jmp (%r15)

.L4:

mov $0x45543818, %r15

jmp JIT$$interrupt_handler

而如果我们采用opcache.jit=1201, 我们可以得到如下结果:

JIT$simple: ; (/tmp/1.php)

sub $0x10, %rsp

call ZEND_QM_ASSIGN_NOREF_SPEC_CONST_HANDLER

add $0x40, %r15

jmp .L2

.L1:

call ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED_HANDLER

cmp $0x0, EG(exception)

jnz JIT$$exception_handler

.L2:

cmp $0x0, EG(vm_interrupt)

jnz JIT$$interrupt_handler

call ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER

cmp $0x0, EG(exception)

jnz JIT$$exception_handler

cmp $0x452a0858, %r15d

jnz .L1

add $0x10, %rsp

jmp ZEND_RETURN_SPEC_CONST_LABEL

你也可以尝试各种debug的配置,比如opcache.jit_debug=0xff,将会有更多的信息输出。

好了,JIT的使用就简单介绍到这里,关于JIT本身的实现等细节,以后有时间,我再来写吧。

大家现在就可以去php.net下载PHP8来测试了 :)

thanks

php的JIT特性,PHP8新特性之JIT简介相关推荐

  1. php8网站,PHP8新特性解读(开发代码实例演示)

    " 本文主要内容为解读PHP8.0的主要新特性"PHP8新特性 前言 PHP8在2020年11月26日正式发布,又一个里程碑到来. 根据官网的信息目前已经发布到了8.0.2版本,但 ...

  2. 八、 PHP 自定义函数 (php8 新特性)

    1. 函数的基本语法 //创建函数 function fun_name( 参数列表) {//函数体:由一条或多条语名组成,可空 } /* 1. 必须使用关键字:function 声明 2. 函数名称不 ...

  3. 【PHP面试宝典1000题】PHP7和PHP8新特性大总结

    PHP7新特性 1.标量类型声明 (1)默认模式 <?php // 默认模式(强制模式) function sumOfInts(int ...$ints) {return array_sum($ ...

  4. php 8 jit,PHP JIT 是什么?PHP8 新特征之 JIT 图文详解_后端开发

    PHP8 alpha1已经在昨天宣布,置信关于JIT是人人最体贴的,PHP8 JIT是什么,又怎样用,又有什么要注意的,以及机能提拔究竟咋样? 视频教程引荐:<PHP编程从入门到通晓> 起 ...

  5. html5 svg特性,HTML5新特性——HTML 5 Canvas vs. SVG

    Canvas 和 SVG 都允许您在浏览器中创建图形,但是它们在根本上是不同的. SVG SVG 是一种使用 XML 描述 2D 图形的语言. SVG 基于 XML,这意味着 SVG DOM 中的每个 ...

  6. ES7新特性01-ES7新特性

    ES7新特性01-ES7新特性 文章目录 ES7新特性01-ES7新特性 includes **(幂运算) <!DOCTYPE html> <html lang="en&q ...

  7. ES10新特性01-ES10新特性

    ES10新特性01-ES10新特性 文章目录 ES10新特性01-ES10新特性 一.Object.fromEntries 二.字符串的扩展方法-trimStart 与 trimEnd 三.数组方法扩 ...

  8. php8的jit如何使用,PHP JIT 是什么?PHP8 新特性之 JIT 图文详解

    PHP8 alpha1已经在昨天发布,相信关于JIT是大家最关心的,PHP8 JIT是什么,又怎么用,又有什么要注意的,以及性能提升到底咋样? 首先,我们来看一张图: (右图有点错误就是,当JIT以后 ...

  9. 全网最全的 php8 新特性

    目录 一. 官方网站 二.命名参数 三.属性注解 四.构造器属性的提升 五.联合类型 六.match表达式 七.nullsafe运算符 八.字符串数字弱类型比较优化 九.函数错误一致性 十.JIT优化 ...

最新文章

  1. The prefix context for element context:component-scan is not bound.
  2. PHP的替换strstr strtr str_replace substr_replace
  3. 医疗:pacs(3)
  4. BOM+DOM+JavaScript读取与操作网页对象
  5. 工作到了第七年,说说自己每天的工作(一)
  6. 天正电气lisp是什么文件_模仿天正电气低压系统图 - AutoLISP/Visual LISP 编程技术 - CAD论坛 - 明经CAD社区 - Powered by Discuz!...
  7. esp8266 SOC方案经过半年沉淀之后再度重启二
  8. 短信猫JAVA二次开发包SMSLib,org.smslib.TimeoutException: No response from device解决方案...
  9. VMare虚拟机无法识别USBkey问题
  10. Biopython -- Bio.Entrez module
  11. 腾讯云域名证书下载_备案域名证书获取
  12. Tryhackme -Skynet(考点:smb 密码爆破 cuppa RFI cronjob - tar提权)
  13. c语言:求两个数的最大公约数与最小公倍数
  14. 275、从零开始教你配置H3C路由器
  15. Excel进行数据分析
  16. A Generic Deep Architecture for Single Image Reflection Removal and Image Smoothing(CEILNet)
  17. 计算机软件技术基础图片,计算机软件技术基础.ppt
  18. Arduino学习笔记2
  19. 一场顶级学术会议一票难求背后,是AI产业热浪下学界的矛盾与茫然
  20. 比MySQL快801倍,太颠覆了!

热门文章

  1. 什么是NP问题,NP-complete和NP-hard问题.
  2. Android自定义底部带有动画的Dialog
  3. 别看了!我们该认认真真写博客了…
  4. html/template 和 text/template区别
  5. java 插入排序及希尔排序
  6. ceph块存储的创建
  7. 自动解锁Bitlocker加密硬盘
  8. 小强期中考试(考察1-9章)
  9. 倍福--两台TwinCAT3之间做Ethernet IP通信
  10. python,pip,xlrd 安装