JIT编译原理

一、查看JIT编译原理图

二、Zend Opcache作用

1、检查opcodes是否缓存

2、zend compiler编译器进行编译生成opcodes

3、optimizer优化器生成优化后的opcodes

4、把优化后的opcodes放入opcodes cache缓存

5、经过zend vm虚拟机生成opcodes handlers处理程序

6、送入x86 cpu架构进行执行

三、JIT编译原理

1、检查opcodes是否缓存

2、zend compiler编译器进行编译生成opcodes

3、optimizer优化器生成优化后的opcodes

4、把优化后的opcodes放入opcodes cache缓存

5、jit编译器把optimized opcodes再次编译成汇编机器码machine codes

6、进入zend vm虚拟前先检查是否开启jit引擎

7、如果已经开启了jit引擎则直接读取机器码中的jit buffer代码片段

8、送入x86 cpu架构进行执行

四、Opcache示意图的关键点

1、Opcache会做opcode层面的优化,比如图中的两条opcode合并为一条

2、PHP8的JIT目前是在Opcache之中提供的

3、JIT在Opcache优化之后的基础上,结合Runtime的信息再次优化,直接生成机器码

4、JIT不是原来Opcache优化的替代,是增强

5、目前PHP8只支持x86架构的CPU

Tracing JIT和Function JIT编译引擎

一、JIT功能开启

#php.iniopcache.jit=1205opcache.jit_buffer_size=64M

二、opcache.jit说明

1、是否在生成机器码的时候使用AVX指令, 需要CPU支持

0: 不使用

1: 使用

2、寄存器分配策略

0: 不使用寄存器分配

1: 局部(block)域分配

2: 全局(function)域分配

3、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

4、JIT优化策略,数值越大优化力度越大

0: 不JIT

1: 做opline之间的跳转部分的JIT

2: 内敛opcode handler调用

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

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

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

三、JIT配置

1、disable在启动时完全禁用JIT功能,并且在运行时无法启用

2、off禁用,但是可以在运行时启用JIT

3、on启用tracing模式

4、tracing数值配置的别名1254

5.function数值配置的别名1205

四、JIT实用配置

opcache.jit=tracingopcache.jit_buffer_size=64M

Opcodes编译原理

一、opcodes作用opcodes是一种php脚本编译后的中间语言,就像java的bytecode,或者.net的msl

二、原生php代码<?php

echo "Hello World";

$a = 1 + 1;

echo $a;

?>

三、PHP执行这段代码会经过如下4个步骤

#PHP的语言引擎Zend

1、Scanning(Lexing) ,将PHP代码转换为语言片段(Tokens)

2、Parsing, 将Tokens转换成简单而有意义的表达式

3、Compilation, 将表达式编译成Opocdes

4、Execution, 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能

四、Scanning

1、#用token_get_all处理以上PHP原生代码#

index.php<?php

$str='<?php  echo "Hello World"; $a = 1 + 1; echo $a;?>';

$arr=$tokens=token_get_all($str);

echo "

";

print_r($arr);

echo "

";

Array( [0] => Array ( [0] => 367 [1] => Array ( [0] => 316 [1] => echo ) [2] => Array ( [0] => 370 [1] => ) [3] => Array ( [0] => 315 [1] => "Hello World" ) [4] => ; [5] => Array ( [0] => 370 [1] => ) [6] => = [7] => Array ( [0] => 370 [1] => ) [8] => Array ( [0] => 305 [1] => 1 ) [9] => Array ( [0] => 370 [1] => ) [10] => + [11] => Array ( [0] => 370 [1] => ) [12] => Array ( [0] => 305 [1] => 1 ) [13] => ; [14] => Array ( [0] => 370 [1] => ) [15] => Array ( [0] => 316 [1] => echo ) [16] => Array ( [0] => 370 [1] => ) [17] => ;)

2、Parsing

#接下来,就是Parsing阶段了,Parsing首先会丢弃Tokens Array中的多余的空格,将剩下的转成一个一个的简单的表达式

1.echo a constant string

2.add two numbers together

3.store the result of the prior expression to a variable

4.echo a variable

3、Compilation

#它会把Tokens编译成一个个op_array* ZEND_ECHO 'Hello World'* ZEND_ADD ~0 1 1* ZEND_ASSIGN !0 ~0* ZEND_ECHO !0> ```

4、由Zend引擎一行一行读取并执行.

Opcache和JIT功能开启

一、opcache配置

#php.inizend_extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20200930/opcache.soopcache.enable=1opcache.enable_cli=1

二、jit配置

#php.ini

1、使用数值opcache.jit=1235opcache.jit_buffer_size=64M

2、使用简单标记opcache.jit=tracingopcache.jit_buffer_size=64M

三、检测

#php文件phpinfo();

JIT高性能测试

一、PHP原生代码

#index.php<?php $a=1; $b=2; $c=$a+$b;?>

二、获得JIT汇编后的机器码

#/usr/local/php/bin/php/usr/local/php/bin/php -d opcache.jit=1205 -d opcache.jit_debug=0x01 index.php/usr/local/php/bin/php -d opcache.jit=function -d opcache.jit_debug=0x01 index.phpJIT$simple: ; (/tmp/1.php) sub $0x10, %rsp xor %rdx, %rdx jmp .L2.L1: add $0x1, %rdx

三、JIT基准测试

#Zend/bench.php#cp /mnt/php-8.0.0/Zend/bench.php /usr/local/nginx/html/bbs/

1、jit禁用

/usr/local/php/bin/php -d opcache.jit_buffer_size=0 bench.php/usr/local/php/bin/php -d opcache.jit=disable bench.php

2、jit开启

/usr/local/php/bin/php -d opcache.jit_buffer_size=64M -d opcache.jit=1205 bench.php/usr/local/php/bin/php -d opcache.jit=tracing bench.php

四、JIT计算压力测试

#index.php<?php $a=1; $b=2; $c=$a+$b;?>

#win abab -n10 -c10 http://bbs.linux.com/index.phpab -n1000 -c1000 http://bbs.linux.com/index.phpab -n10000 -c10000 http://bbs.linux.com/index.php

五、JIT WEB压力测试

#index.phpphpinfo();

#win abab -n10 -c10 http://bbs.linux.com/index.phpab -n1000 -c1000 http://bbs.linux.com/index.phpab -n10000 -c10000 http://bbs.linux.com/index.php

php的jit,PHP8.0新特性:JIT即时编译相关推荐

  1. 编译原理php,PHP8.0新特性:JIT即时编译

    JIT编译原理 一.查看JIT编译原理图 二.Zend Opcache作用 1.检查opcodes是否缓存 2.zend compiler编译器进行编译生成opcodes 3.optimizer优化器 ...

  2. 【收藏】C# 2.03.0新特性总结

    c#2.0新特性 范型 我们知道通用的数据结构可以采用object存储任何数据类型.使用object问题是: 显示的强制转带来的代码复杂性 换装箱拆箱的性能损失(为什么有性能损失?因为涉及动态内存分配 ...

  3. 分析 C# 2.0 新特性 -- 范型(Generics)

    分析 C# 2.0 新特性 -- 范型(Generics) 作者:梁振[MS-MVP]   范型是提高面向对象程序多态性设计衍生的. 1,C# 多态性设计回顾和展望 在引入范型这个概念之前,回顾一下1 ...

  4. Android5.0,6.0,7.0,8.0新特性整理

    背景 Android5.0(Android Lollipop)是谷歌公司2014年10月发布的全新安卓系统,至今已经两年多.然而由于国产手机对安卓ROM的深度定制或修改,以及手机厂商.芯片制造商.运营 ...

  5. Android6.0新特性

    1.大量漂亮流畅的动画 安卓6.0系统增加了大量漂亮的过度动画,可以从视觉上减少卡顿感,给用户带来流畅的体验.说到过渡动画,以前可是苹果手机的拿手好戏,现在安卓大有赶超iOS的趋势. 2.相机新增专业 ...

  6. Android5.0,6.0,7.0新特性整理

    背景 Android5.0(Android Lollipop)是谷歌公司2014年10月发布的全新安卓系统,至今已经两年多.然而由于国产手机对安卓ROM的深度定制或修改,以及手机厂商.芯片制造商.运营 ...

  7. Android5.0 6.0 7.0新特性

    原文链接:http://blog.csdn.net/haovip123/article/details/54618642 背景 Android5.0(Android Lollipop)是谷歌公司201 ...

  8. JDK5.0新特性系列---目录

    JDK5.0新特性系列---目录 JDK5.0新特性系列---1.自动装箱和拆箱 JDK5.0新特性系列---2.新的for循环 JDK5.0新特性系列---3.枚举类型 JDK5.0新特性系列--- ...

  9. [转]C# 2.0新特性与C# 3.5新特性

    C# 2.0新特性与C# 3.5新特性 一.C# 2.0 新特性: 1.泛型List<MyObject> obj_list=new List(); obj_list.Add(new MyO ...

最新文章

  1. 控制台输出覆盖当前行显示
  2. 大型网站架构 - 1.架构的演变过程
  3. java 内存模型6_深入理解Java内存模型(六)——final
  4. python图像对比_用python实现对比两张图片的不同
  5. 对等通信_新的通信技术如何影响对等参与
  6. clickhouse数据类型
  7. 微信小程序|基于小程序+C#实现聊天功能
  8. c4d流体插件_C4D流体烟雾模拟插件TurbulenceFD C4D v1.0.1437中文版流体
  9. 前后端分离单页面应用(SPA)项目示例(Vue+ElementUI+Axios+Django+MySql)
  10. Team building | 什么?团建还能这么玩?
  11. 自动驾驶汽车是如何利用高精度地图和高精度定位来导航
  12. 10麦客和300挖藕人
  13. 产品运营之道:用户反馈(一)
  14. 论文笔记(五)面向大规模智能计量的分布式差分隐私
  15. 大白菜U盘重装win7系统教程,PE重装win7系统教程
  16. 计算机专业的会修电脑吗,常被错误理解的三大专业,计算机专业会修电脑,机械工程很是离谱...
  17. 在阿里云下安装SQL Server
  18. 《龙武》9.15正式上线链游玩家平台 | 再续仙侠、血雨江湖
  19. 大学生日记 我走出了农村 却永远走不进城市
  20. python之pyecharts画图

热门文章

  1. 今日即将更新芝麻分!来看看支付宝芝麻分500以上用户的福利!
  2. 缓存字节流BufferedInputStream使用及原理解析
  3. 【JVM】JVM内存结构之——常量池
  4. 全兼容的纯CSS级联菜单
  5. 淘宝装修新旺铺如何让店招导航栏透明?
  6. [英语单词]retire
  7. Java中方法重写和方法重载的6个区别?
  8. Java中的网络编程入门
  9. 应对流氓软件的小窍门[转]
  10. 小兔鲜注册页面验证、阶段案例(登录、首页页面)(重点)、小兔鲜放大镜效果——DOM