PHP8 就要发布了,大版本号更新,PHP 8的JIT是最大的新特性。大家可能很多人不知道,其实PHP8的JIT是先于PHP7开始开发的。

那还是在2013年的时候,我还在微博负责微博主站架构,记得是某个中午正在跟微博的同事开会,Zeev突然在Skype上找我,问我有没有兴趣做Zend的兼职顾问,参与一个很有趣的项目。

图0:写在PHP8发布之前的话

(Zend顾问合同)

于是整个2013年下半年,我都跟着Dmitry在为PHP5.5开发基于LLVM的JIT编译器,在那个过程中,Dmitry教了我很多的东西,我非常感谢他。

很多后来的PHP开发者可能不知道,在那几年,PHP的社区面临着一个很大的分裂风险,也就是Facebook的HHVM,当时HHVM在性能上有很明显的优势,除了Facebook以外,不少组织和公司,比如Wikimedia,国内的百度, 为了性能也开始尝试迁移PHP到HHVM。

整个PHP社区面临着分裂的风险。而性能,是这一切的原因。

所以,当时PHP5.5的JIT就是为了解决这个严重的风险而开启的,当然后来的故事大家也都知道了,基于LLVM的JIT在Benchmark上有着很明显的提升,但在实际的项目中看不到明显的性能提升,最大的问题现在来看还是在于PHP本身的数据结构基础。

虽然那个版本的JIT失败了,但是在开发过程中我们发现了很多PHP本身可以优化的点,整个开发过程中对于我和Dmitry都对PHP本身对性能提升有了一些新的想法,于是柳暗花明,到了2014年春节,我们开始暂停了JIT的开发,转向了PHP NG也就是PHP7的开发。

再后来,PHP7在性能上的巨大成功,成功的阻止了社区的分裂,不少原来HHVM的开发者也回到了PHP,比如在Facebook工作的Sara Golemon,也就是PHP扩展开发经典书记EE Book的作者,她原来一直推广HHVM,而现在她是PHP8的RM(Release Manager).

图1:写在PHP8发布之前的话

(Symfonyu宣布鉴于PHP7性能提升明显,放弃HHVM的支持)

PHP7之后,当我们考虑未来的性能提升方向的时候,JIT毫无疑问的再次被拾起来,于是到了2016年,我们再次开启了JIT的开发。不过,此时已经是基于PHP7了。

因为上一次的失败经验,让我们少走了很多的弯路,整个过程应该算是很顺利的,基于PHP7,Dynasm的JIT很快就完成了从LLVM JIT那套的迁移开发。

图2:写在PHP8发布之前的话

(Zend Intel双周会邀,虽然后来不开了,但日历上一直留着)

还记得那时候,每个双周二晚上23点, 都要和Dmitry与Intel的工程师一起开会,讨论优化方向,经常周三睡眠不足。但整个那几个月确实非常让人开心和激动。感觉每天都能学到新的东西。

然而,实际项目中的魔咒再一次出现,我们还是在Wordpress中看不到明显的性能提升,当时我们采用的是JIT On Load, 也就是把所有的PHP函数都JIT化,造成了binary size大幅增长,Cache Miss大幅增长。这个问题其实在LLVM JIT的时候就存在,只不过我们以为通过PHP7的优化,加上抛弃了LLVM改用Dynasm,会有所改善。

没有办法,沮丧了一段时间后,我们开始尝试其他的JIT策略,比如JIT on Requset, Counter Based JIT, 以及最近我认为更有前景的Tracing JIT。

值得一提的是Counter Based JIT,  也就是当某个函数执行次数超过一定数量以后就JIT,当然这不算什么了不起的想法,也就是某个下午,我通过离线Profile统计获得Wordpress最热的top50函数然后JIT,这个方式让我们第一次看到了在Wordpress上有了10%的性能提升。

图3:写在PHP8发布之前的话

(2016年10月13日,激动的和Dmitry分享)

这个给了我们巨大的信心,再后来通过不断的完善,不断的去读各种JIT相关的Paper,然后把它们引入。一定程度上来说,那俩年是我英文能力进一步大幅提升的时期,成为了一个真正意义上的Paper搬运工。

在PHP7.4发布的时候,我们本来是想把JIT引入7.4,作为实验特性,因为我们认为性能提升已经很明显,我们也需要更多的实际应用的测试。

图4:写在PHP8发布之前的话

(PHP变得越来越快)

但是社区投票拒绝了,但因此定义了PHP8,也就有了马上要发布的PHP8.

再后来的日子,因为我的工作职责变化,主要精力都被工作吸引,也就是贝壳上的VR看房,我负责组建了贝壳如视(真实,如你所视)事业部,从6个人开始,团队自己设计研发VR采集硬件,软件,以及负责运营落地。到今天累计三维重建500万房屋空间。这个过程,牵扯了我的大部分精力,慢慢的淡出了PHP8其他部分的开发。

但JIT一直是我再忙也会每周跟进进度的部分,因为它是我付出了心血的项目,我期望能看到它真正发布的那一天。

而这一天,终于来了….. Welcome,PHP8 With My JIT。

图5:写在PHP8发布之前的话

laruence at php dot net

余下全文(1/3)

本文最初发表在微信公众号,文章内容属作者个人观点,不代表本站立场。

分享这篇文章:

请关注我们:

发表评论

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