2017全球互联网架构大会在上海召开,鸟哥(惠新宸)在大会上分享了《更好的PHP:PHP & JIT》,介绍了自 PHP 7 发布两年以来,下一步的PHP的性能提升方向是什么? PHP的性能还能有多大的提升等一系列 PHP 开发者关心的问题。
我虽然没有去到现场,但有幸同事帮忙带回大会中的内容分享,在感叹 PHP 发展迅速的同时也在感慨现在技术发展的速度是如此之快。这次会议的主题是“JIT”,也是新特性,下面我会以我的理解分析一下 PHP 这个语言在未来的版本会做出那些变更和新特性。
JIT所谓 JIT,就是 (JUST-IN-TIME),说白了就是在程序运行时动态对程序进行编译,生成平台相关的机器码,从而加快程序运行速度。在诸如 JAVA,C# 等语言早就应用了,在 PHP 的历史 Release 里也有提及,可以追溯到 2015 年左右 (http://news.php.net/php.internals/83994) ,但是为什么 PHP 迟迟不引用呢?有很多种说法:
JIT 对数据类型要求很严格,强制声明类型带来的才是性能的提升,但付出的代价就是要多写一些代码。PHP 设计的初衷就是快速开发,这显然违背了最初的原则。
第二点我是从网上看过来的,简单说就是核心开发组没有把精力放在支持 JIT 上面,导致这个特性一拖再拖。
PHP 合体 JIT
在没有 JIT 之前,PHP 执行一个文件是调用引擎加载 PHP 文件,解释器在逐行逐句的解析 PHP 代码。但是引入 JIT 后,JIT 编译器会根据 Runtime 信息对热点代码进行动态编译生成机器码,然后这部分代码以后就可以直接执行了,而不需要解释器逐条解释执行了,运行效率便得到了提升。相对于 Golang 或其他需要先编译再发布才能执行的代码,JIT 不用每次都编译,发布速度会很快。再加上它是动态查找热点代码,所以它会更加了解代码,减少内存消耗。如果某段代码被执行的次数相对于其他代码低,那么他就会被编译器忽略。即使有了这些特性,开发人员也不必根据不同的平台编译不同的代码,对码农来说,编写的代码依旧和以前是透明开放的。下图是在标准测试中引入 JIT 技术后,PHP 运行效率比 7.2 有 100% 的性能提升,不过在实际生产环境中效果不会有这么好,毕竟有些代码不够“严格”。
PHP 会越来越严格?自从 PHP 5.6 发布至 7.2 以来,如果你关注版本更新的内容的话,会发现加入的很多特性都和强制类型有关,比如在严格模式下的强制参数类型,如果传递了错误类型的参数会抛出致命错误,像这样:
// 声明严格模式
declare(strict_types=1);
// 规定入参类型必须是整形
functionsum(int$a,int$b){return$a+$b;
}
var_dump(sum(1,2));// 输出 3
var_dump(sum(1.5,2.5));// 报错
在 PHP 7.1 后又引入了返回类型,规定一个函数的返回数据类型,像这样:
functionfirst():void{// ...
}
functionsecond():void{// ...return;
}
如果这都不算强类型语言的特性,那也可以说 PHP 算得上是半个强类型语言了,这一切的一切,是不是在为 JIT 做准备呢?或者说,PHP 已经准备转换为强类型语言了?这些问题还有待验证。类型预测如果 PHP 支持了 JIT,在编译代码时,还要为一些没有声明类型的变量做判断,那么这个优化反而还增加了负担。所以目前迫在眉睫的,就是能够在不给程序员代码量负担的情况下,尽可能的预测变量的类型。这也是从 PHP 7.1 之后的版本核心开发组一直在努力做的事情。但是这项技术还不够成熟。现在预测变量的方式大概是分析代码的上下文,得知当前这行代码中的变量是什么类型。比如这样:
functioncalc($a1,$b2){// $a1: [ANY], $b2: [ANY]$T3=$a1*2;// $T3: [LONG, DOUBLE]$a4=$T3%1000;// $a4: [LONG]$T5=$b2*3;// $T5: [LONG, DOUBLE]$b6=$T5%1000;// $b6: [LONG]$T7=$a4+$b6;// $T7: [LONG, DOUBLE]return$T7;
}
但这样做并不能完全解决这个问题,如果这个变量在函数以外,或是更复杂的引用型变量,或是变量的变量(例如:)。这种预测的方式就没法使用了。那只能要求开发者严格开发者严格遵循每一个变量的严格类型声明?显然也是一个很浩瀚的工程。即使新项目可以遵循这样的规则,老项目里就需要花很大的代价来优化了。这就又衍生出了性能和代价之间的取舍问题。
总结面对现在的技术发展趋势,一个合格的程序员只掌握一门技术已经不太够用了,除了 PHP 之外,你至少还要掌握诸如 Python、Golang 这些语言。有一个良好的学习能力是一个程序员必须有的技能。但是对于已经发展了 20 年的 PHP 来说,它的潜能依旧很大。将来 PHP JIT 一发布,性能方面又将有很大的提升,在这里引用鸟哥的一句话,“黑php之前,先数数他给你挣了多少钱”,我一直认为业务是技术存在的理由,能不能快速响应需求、实现业务才是最根本的。
领取专属 10元无门槛券
私享最新 技术干货