PHP8中设置开启JIT

作者: wxfeng 分类: php 发布时间: 2020-12-30 14:31    阅读 73 次

使用效果分析

性能收益可能不会很大

大多数 php 应用程序不会因为使用即时编译器而获得很大的性能收益。这也是为什么 Zeev 建议为你的应用程序分析和试验不同的 JIT 配置是最好的方法。

如果您使用的是 PHP FPM,则通常会在多个请求之间共享已编译的操作码,但这仍然不能改变游戏规则。

这是因为 JIT 优化了计算密集型的操作,而如今大多数 php 应用程序比其他任何东西都更受 I/O 约束。如果您无论如何都要访问磁盘或网络,则处理操作是否已编译则无关紧要。时间上将非常相似。

除非…

你正在做一些不受 I/O 约束的事情, 像图像处理或机器学习。 任何不接触 I/O 的东西都将受益于 JIT 编译器。

这也是为什么现在人们说我们更愿意用 PHP 编写原生功能而不是 C 编写的原因。 如果仍然要编译此功能,则开销将毫无表现力。

**************************************

PHP8.0.0于2020年11月26日发布了
PHP 8在PHP的内核中添加了JIT编译器,可以极大地提高性能。更强的cpu密集处理
开启PHP8.0的JIT
修改php.ini

;加载php_opcache拓展
zend_extension=php_opcache
;开启opcache,关闭则不会执行jit
opcache.enable=1
;开启cli模式opcache
opcache.enable_cli=1
;开启jit的debug
opcache.jit_debug=1
;默认是tracing,也可以function,官方最近值是1255
opcache.jit=1255
opcache.jit_buffer_size=100M

phpinfo()查看opcache拓展的配置,或者var_dump(opcache_get_status()[‘jit’]);查看jit状态
正常状态下输出

array:7 [
  "enabled" => true
  "on" => true
  "kind" => 5
  "opt_level" => 4
  "opt_flags" => 6
  "buffer_size" => 4080
  "buffer_free" => 0
]

如果enabled和on是正确的,那就ok了!

在php8.0与php7.3分别执行下面一段代码

$time=microtime(true);
for($i=0;$i<10000000;$i++){
    $d+=$i;
}
echo $d;
echo '<hr>';
echo microtime(true)-$time;

php8.0耗时 0.0856s
php7.3耗时2.18061s

opcache.jit配置项专门配置优化级别|JIT触发器|寄存器分配|CPU特定的优化标志
配置的顺序是:CPU特定的优化标志、寄存器分配、JIT触发器、优化级别,官方给的推荐值为1255
CPU特定的优化标志:

0 没有
1个 启用AVX指令生成

R-寄存器分配:

0 不执行寄存器分配
1个 使用本地线性扫描寄存器分配器
2 使用全局线性扫描寄存器分配器

JIT触发器:

0 JIT在第一次脚本加载时的所有功能
1个 首次执行时的JIT函数
2 在第一个请求时进行概要分析,并在第二个请求时编译热功能
3 动态分析并编译热功能
4 在文档注释中使用@jit标记编译函数
5 跟踪JIT

O-优化级别:

0 不要准时
1个 最小JIT(调用标准VM处理程序)
2 选择性VM处理程序内联
3 基于单个函数的静态类型推断的优化JIT
4 静态类型推断和调用树的优化JIT
5 基于静态类型推断和内部过程分析的优化JIT

所以1255指的是
启用AVX指令生成,使用本地线性扫描寄存器分配器,跟踪JIT,基于静态类型推断和内部过程分析的优化JIT
function 是C = 1,R = 2,T = 0,O = 5的别名。 1205
tracing 是C = 1,R = 2,T = 5,O = 4的别名。 1254

作者:seahonest
链接:https://www.jianshu.com/p/a7d9edaf75d0
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注