iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP8新特性之JIT案例讲解
  • 175
分享到

PHP8新特性之JIT案例讲解

2024-04-02 19:04:59 175人浏览 独家记忆
摘要

PHP8 alpha1已经在昨天发布,相信关于JIT是大家最关心的,它到底怎么用,有什么要注意的,以及性能提升到底咋样? 首先,我们来看一张图: 左图是 php 8之前的Opcac

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

首先,我们来看一张图:

deabbe4c2476e16f4314c7d54b552f48.png

左图是 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

到此这篇关于PHP8新特性之JIT案例讲解的文章就介绍到这了,更多相关PHP8新特性之JIT内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: PHP8新特性之JIT案例讲解

本文链接: https://www.lsjlt.com/news/134821.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PHP8新特性之JIT案例讲解
    PHP8 alpha1已经在昨天发布,相信关于JIT是大家最关心的,它到底怎么用,有什么要注意的,以及性能提升到底咋样? 首先,我们来看一张图: 左图是 PHP 8之前的Opcac...
    99+
    2024-04-02
  • Go1.18新特性之泛型的全面讲解
    目录序1. 一切从函数的形参和实参说起2. Go的泛型3. 类型形参、类型实参、类型约束和泛型类型3.1 其他的泛型类型3.2 类型形参的互相套用3.3 几种语法错误3.4 特殊的泛...
    99+
    2023-03-09
    Golang 泛型使用 Golang 泛型 Go 泛型
  • Java 17新特性讲解与代码实例
    Java 17是Java SE 17的开源参考实现,于2021年9月14日正式发布,是Java 11以来的又一个长期支持(LTS)版本。Java 17中有一些新的特性和改进,本文将对它们进行简要的介绍和示例。 密封类 密封类和接口限制了哪些...
    99+
    2023-09-07
    java 开发语言 java17
  • Java8新特性之Collectors.joining()实例详解
    目录方法定义无参方法单个参数多个参数如果流中的数据是字符串如果流中的数据是对象总结方法定义 Java 8 流 ( stream ) 收集器 ( Collectors ) 中的&nbs...
    99+
    2023-01-12
    java8新特性collectors.joining() java8 collectors.joining()
  • C#11新特性使用案例详解
    目录前言新特性之原始字符串使用案例原始字符串使用需要注意的地方什么情况下需要超过三个双引号开头尾引号和尾引号前面的换行符不包括在最终内容中结尾的三个引号不另起一行行不行和内插字符一起...
    99+
    2024-04-02
  • PHP5与PHP8:新特性和升级之间的差距
    PHP是一种广泛使用的服务器端脚本语言,用于开发Web应用程序。它已经演变了多个版本,每个版本都带来了新的特性和改进。PHP5和PHP8是两个重要的版本,它们之间有着较大的差距。本文将对这两个版本之间的新特性和升级差距进行探讨。...
    99+
    2024-01-26
    PHP 特性差距
  • Java之springcloud Sentinel案例讲解
    一、Sentinel是什么? Sentinel (分布式系统的流量防卫兵) 是阿里开源的一套用于服务容错的综合性解决方案。 它以流量为切入点,从流量控制、熔断降级、系统负载保护等多...
    99+
    2024-04-02
  • Python3.10新特性之match语句示例详解
    目录正文通过字典间接实现 switch在case中使用元组正文 在Python 3.10发布之前,Python是没有类似于其他语言中switch语句的,要实现类似的功能最简单的方法...
    99+
    2023-02-09
    Python3.10特性match语句 Python match
  • php7新特性之标量类型声明的案例分析
    这篇文章主要介绍php7新特性之标量类型声明的案例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!PHP7增加了标量类型声明的特性,标量类型声明有两种模式   :强制模式(默认)严格模式   &...
    99+
    2023-06-14
  • 深度解析PHP8的新特性和优化程度
    PHP8带来了哪些提升?详解新特性与优化,需要具体代码示例 随着时间的推移,PHP成为了最受欢迎的Web开发语言之一。PHP8作为PHP的最新版本,在性能、安全性和语言特性上都带来了一系列重要的改进。本文将详细介绍PHP8带来的...
    99+
    2024-01-13
    优化 PHP 新特性
  • JavaWeb之监听器案例讲解
    1. 监听器 实现一个监听器的接口;(有n种监听器) 1.1 编写一个监听器(实现监听器接口) OnlineCountListener .java package com.tia...
    99+
    2024-04-02
  • Java之操作Redis案例讲解
    首先 下载 jedis.jar包 然后再 工程设置里面找到Libraries,点击+。添加下载好的jedis.jar包。点击OK退出即可 创建Java_Control_Redis类...
    99+
    2024-04-02
  • Python之urlencode和urldecode案例讲解
    python中的urlencode和urldecode python将字符串转化成urlencode ,或者将url编码字符串decode的方法: 方法1: urlencod...
    99+
    2024-04-02
  • Java之String.format()方法案例讲解
    前言:  String.format()作为文本处理工具,为我们提供强大而丰富的字符串格式化功能,这里根据查阅的资料做个学习笔记,整理成如下文章,供后续复习查阅。 一. f...
    99+
    2024-04-02
  • php之Aes加密案例讲解
    在项目中,尤其是pc端的时候,我们在用户登录后会给前端返回一个标识,来判断用户是否登录,这个标识大多数都是用户的id ​      ...
    99+
    2024-04-02
  • php7新特性之返回类型声明的使用案例
    这篇文章主要介绍了php7新特性之返回类型声明的使用案例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。突然感觉,php逐渐走向强类型语言了,和java、c++这类强类型语言有...
    99+
    2023-06-14
  • PHP8新特性解析:提升网站性能的关键所在
    PHP8的新特性一览,为你的网站带来更好的性能,需要具体代码示例 介绍:PHP是一种广泛使用的编程语言,特别适用于Web开发。随着新版本的推出,PHP不断提供新的功能和改进,以提高性能和开发效率。PHP8作为最新版本,引入了许多...
    99+
    2024-01-13
    性能 PHP 新特性
  • 开发者如何受益于PHP8的新特性解析?
    PHP8的新特性解析:对于开发者来说有何影响? 随着技术的不断发展,编程语言也在不断更新和演进。最近发布的PHP8带来了一系列令人兴奋的新特性,这些特性对于开发者来说有着重要的影响。本文将对PHP8的一些主要特性进行解析,并给出...
    99+
    2024-01-13
    JIT编译器 PHP的新特性: 类型引用 属性的可见性改进
  • Android之OOM异常解决案例讲解
    02-03 08:56:12.411: E/AndroidRuntime(10137): FATAL EXCEPTION: main 02-03 08:56:12.411: E/...
    99+
    2024-04-02
  • JavaScript之事件循环案例讲解
    js中的事件循环 因为JavaScript是单线程的,同一事件只能执行一种方法,所以会将程序中的方法加入到执行栈中按照后进先出的顺序依次执行,当遇见异步任务时不会被阻塞,而是将任务放...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作