PHP8已发布挺久了,PHP8的JIT功能着实让PHP性能提升不少,先上图看下效果吧。
测试代码
php.php
$r = 0;
for ($c = 0; $c < 1000000000; $c++) {
$r += $c;
}
}
t();
node.js
var r = 0;
for (var c = 0; c < 1000000000; c++) {
r += c;
}
golang.go
package main
func main() {
var r int
for c := 0; c < 1000000000; c++ {
r += c
}
}
java.java
// 编译 javac java.java
public class java {
public static void main(String[] args) {
int r= 0;
int c;
for (c = 0; c < 1000000000; c++) {
r += c;
}
}
}
c.c
//编译 cc -O2 c c.c
int main(int argc,char * argv[]){
int r= 0;
for (int c = 0; c < 1000000000; c++) {
r += c;
}
}
python.py
#!/usr/bin/python3
total=0
for i in range(1000000000):
total+=i
print(total)
python 直接执行终端奔溃。所以就没测试了,感兴趣的同学可以自己测试下,最好用Cpython,不然慢得没有可比性。有些python培训机构吹python的时候总不忘了黑PHP一下。从上面的测试数据来看,PHP很差吗?我不是计算机科班毕业,在网上买了一本PHP编程入门的书,一个月后就用PHP搞了一个团购网站,这相对于我花了十多年时间学习C语言来比较,可以说PHP是门非常容易学习的编程语言。
启用JIT
php8才支持JIT,启用JIT前需要启用opcache。编辑php.ini 设置如下信息
opcache.enable=1 opcache.enable_cli=1 opcache.jit_buffer_size=100M //实际上是启用JIT的唯一设置项 opcache.jit=1255 //有默认值,不是必须设置。
配置说明 opcache.jit=CRTO
-
C 指定是否在生成机器码时使用AVX指令, 需要CPU支持
- 0 不使用
- 1 使用
终端执行以下命令可以用来检查CPU是否支持AVX指令
$ inxi -Cxxx |grep avx
Flags: avx avx2 ht lm nx pae sse sse2 sse3 sse4_1 sse4_2 ssse3 vmx -
R 寄存器分配策略
- 0 不使用寄存器分配
- 1 局部(block)域分配
- 2 全局(function)域分配
-
T 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
-
O JIT优化策略
- 0 不JIT
- 1 做opline之间的跳转部分的JIT
- 2 内敛opcode handler调用
- 3 基于类型推断做函数级别的JIT
- 4 基于类型推断,过程调用图做函数级别JIT
- 5 基于类型推断,过程调用图做脚本级别的JIT
以上配置来源:
- PHP 8新特性之JIT简介
- PHP 8: How to setup the JIT



