写在PHP8发布之前的话
PHP8 Alpha马上就要发布了,大版本号更新,PHP 8的JIT是最大的新特性。大家可能很多人不知道,其实PHP8的JIT是先于PHP7开始开发的。
那还是在2013年的时候,我还在微博负责微博主站架构,记得是某个中午正在跟微博的同事开会,Zeev突然在Skype上找我,问我有没有兴趣做Zend的兼职顾问,参与一个很有趣的项目。
(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).
(Symfonyu宣布鉴于PHP7性能提升明显,放弃HHVM的支持)
PHP7之后,当我们考虑未来的性能提升方向的时候,JIT毫无疑问的再次被拾起来,于是到了2016年,我们再次开启了JIT的开发。不过,此时已经是基于PHP7了。
因为上一次的失败经验,让我们少走了很多的弯路,整个过程应该算是很顺利的,基于PHP7,Dynasm的JIT很快就完成了从LLVM JIT那套的迁移开发。
(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%的性能提升。
(2016年10月13日,激动的和Dmitry分享)
这个给了我们巨大的信心,再后来通过不断的完善,不断的去读各种JIT相关的Paper,然后把它们引入。一定程度上来说,那俩年是我英文能力进一步大幅提升的时期,成为了一个真正意义上的Paper搬运工。
在PHP7.4发布的时候,我们本来是想把JIT引入7.4,作为实验特性,因为我们认为性能提升已经很明显,我们也需要更多的实际应用的测试。
(PHP变得越来越快)
但是社区投票拒绝了,但因此定义了PHP8,也就有了马上要发布的PHP8.
再后来的日子,因为我的工作职责变化,主要精力都被工作吸引,也就是贝壳上的VR看房,我负责组建了贝壳如视(真实,如你所视)事业部,从6个人开始,团队自己设计研发VR采集硬件,软件,以及负责运营落地。到今天累计三维重建500万房屋空间。这个过程,牵扯了我的大部分精力,慢慢的淡出了PHP8其他部分的开发。
但JIT一直是我再忙也会每周跟进进度的部分,因为它是我付出了心血的项目,我期望能看到它真正发布的那一天。
而这一天,终于来了..... Welcome,PHP8 With My JIT。
laruence at php dot net