首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

THE NEXT GENERATION OF PHP:JIT

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之前,先数数他给你挣了多少钱”,我一直认为业务是技术存在的理由,能不能快速响应需求、实现业务才是最根本的。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171225G0TUSF00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券