加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_阳江站长网 (https://www.0662zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP8新特性之JIT示例讲解

发布时间:2022-06-22 11:35:28 所属栏目:PHP教程 来源:互联网
导读:这篇文章主要介绍了PHP8新特性之JIT案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下。 PHP8 alpha1已经在昨天发布,相信关于JIT是大家最关心的,它到底怎么用,有什么要注意的,以及性能提升到底咋样
  这篇文章主要介绍了PHP8新特性之JIT案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下。
 
  PHP8 alpha1已经在昨天发布,相信关于JIT是大家最关心的,它到底怎么用,有什么要注意的,以及性能提升到底咋样?
 
  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倍 。

  你也可以尝试各种debug的配置,比如opcache.jit_debug=0xff,将会有更多的信息输出。
 
  好了,JIT的使用就简单介绍到这里,关于JIT本身的实现等细节,以后有时间,我再来写吧。
 
  大家现在就可以去php.net下载PHP8来测试了 :)。

(编辑:应用网_阳江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!