PHP8新特性之JIT案例讲解_第1页
PHP8新特性之JIT案例讲解_第2页
PHP8新特性之JIT案例讲解_第3页
PHP8新特性之JIT案例讲解_第4页
PHP8新特性之JIT案例讲解_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

首先,我们来看一张图:

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

PHP8的JIT是在Opcache之中提供的

目前PHP8只支持x86架构的CPU

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

事实上JIT共用了很多原来Opcache做优化的基础数据结构,比如dataflowgraph,callgraph,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调用次数最多的百分之(f_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:内敛opcodehandler调用

3:基于类型推断做函数级别的JIT

4:基于类型推断,过程调用图做函数级别JIT

5:基于类型推断,过程调用图做脚本级别的JIT

基于此,我们可以大概得到如下几个结论:

尽量使用12x5型的配置,此时应该是效果最优的

对于x,如果是脚本级别的,推荐使用0,如果是Web服务型的,可以根据测试结果选择3或5

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

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

simple0.008

simplecall0.004

simpleucall0.004

simpleudcall0.004

mandel0.035

mandel20.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

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

Total0.387

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

simple0.002

simplecall0.001

simpleucall0.001

simpleudcall0.001

mandel0.010

mandel20.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

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

Total0.157

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

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

functionsimple(){

$a=0;

for($i=0;$i1000000;$i++)

$a++;

}

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

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

sub$0x10,%rsp

xor%rdx,%rdx

jmp.L2

add$0x1,%rdx

cmp$0x0,EG(vm_interrupt)

jnz.L4

cmp$0xf4240,%rdx

jl.L1

mov0x10(%r14),%rcx

test%rcx,%rcx

jz.L3

mov$0x1,0x8(%rcx)

mov0x30(%r14),%rax

mov%rax,EG(current_execute_data)

mov0x28(%r14),%edi

test$0x9e0000,%edi

jnzJIT$$leave_function

mov%r14,EG(vm_stack_top)

mov0x30(%r14),%r14

cmp$0x0,EG(exception)

mov(%r14),%r15

jnzJIT$$leave_throw

add$0x20,%r15

add$0x10,%rsp

jmp(%r15)

mov$0x45543818,%r15

jmpJIT$$interrupt_handler

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

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

sub$0x10,%rsp

callZEND_QM_ASSIGN_NOREF_SPEC_CONST_HANDLER

add$0x40,%r15

jmp.L2

callZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED_HANDLER

cmp$0x0,EG(exception)

jnzJIT$$exception_handler

cmp$0x0,EG(vm_interrupt)

jnzJIT$$interrupt_handler

callZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER

cmp$0x0,EG(exception)

jnzJIT$$exception_handler

cmp$0x452a0858,%r15d

jnz.L1

add$0x10,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论