当前位置: 首页 > 科技观察

PHP之父:PHP7性能翻倍关键揭晓

时间:2023-03-12 13:26:23 科技观察

20年老牌网络编程语言PHP,新版PHP7最快10月底发布。这是十年来最大的一次修订。最大的特点是性能上的大突破,可以比之前版本的PHP5快一倍。据PHP之父RasmusLerdorf说,它甚至可以比HHVM虚拟机下的PHP程序的性能更快。HHVM是Facebook针对自身网站特点量身定制的PHP优化机制,不一定适用于任何网站。但RasmusLerdorf表示,新版本的目标之一是让任何网站开发者,即使在使用开发框架Drupal和开源电子商务系统Opencart时,也能拥有与使用HHVM技术相同的性能。在新版本发布前夕,他还趁机参加了台湾的PHPConfTaiwan年会,分享了PHP7性能突破的关键。一门在过去20年中经过多次修改和优化的成熟语言,其性能要翻倍并不容易。RasmusLerdorf坦言,与普通的新项目不同,要找到很大的改进空间并不容易。新版本的PHP并不是通过修改部分程序来达到这个结果的。相反,经过大量的细节优化和性能积累,PHP7的执行性能不逊于HHVM。RasmusLerdorf和PHP核心贡献团队在减少程序运行时移动的内存位数,从而加快执行性能方面付出了很多努力。比如PHP中存储变量的数据结构zval从24位缩减到16位,Hashtable从72位缩减到56位。检查PHP中的函数,看看是否有性能提升的空间。除了减少内存的使用,RasmusLerdorf还考察了CPU的Cache线的运行原理,了解程序代码如何与CPU交互,编译器如何在新的CPU架构下编译程序代码等细节,以确保PHP7程序代码符合现代CPU的体系结构。虽然每一项的优化对性能的贡献不足0.5%,但由于优化项较多,或者某个改进功能被应用反复调用,整体修改的协同结果才能有这么大的进步。在HHVM的刺激下,Facebook决定创建一个兼具性能和功能的PHP。为了优化PHP的运行,它创建了一个带有JIT编译的虚拟机HHVM。HHVM虽然具有快速的执行性能,但其为特定目的而优化的设计只能满足一小部分开发者。相反,RasmusLerdorf不仅想提高PHP的性能,还想同时满足高端用户和业余用户的需求,让PHP7成为兼具性能和通用功能的编程语言。但是,开发一种满足市场上小部分人需求的编程语言并不困难。但是PHP项目面向的对象很多,必须同时满足业余用户和专业开发人员的需求。全面发展是很难的,因为总会有一些民族。“就像用水管喷了一大片区域,每个人的衣服都会微微湿润,但不会有人的衣服完全湿透。”RasmusLerdorf比较。在没有外部框架的情况下,PHP的计算性能非常好,但是受外部框架的影响,原本可以在几秒内处理数千个网页请求的PHP的性能大幅下降,只能处理几十个请求。RasmusLerdorf表示,在HHVM出现之前,用户更关心的是PHP能否降低Web开发的难度,而不是对PHP性能的要求,而这些框架可以让开发者的工作变得更轻松。不过Facebook推出HHVM后,吸引了很多看重PHP性能的用户,RasmusLerdorf也意识到很多用户对性能有需求。他开始思考如何将HHVM的JIT架构与PHP结合起来。但RasmusLerdorf表示,PHP和HHVM在架构设计上有很大的不同。比如HHVM的多线程架构就不是很稳定。另外,HHVM的可移植性不好,要在Windows平台上运行还有很长的路要走,而且很多PHP开发者都是在Windows环境下开发的,HHVM无法照顾到那些用户。RasmusLerdorf说他不能放弃PHP的主要架构。虽然他们考虑过将两者结合起来,但是HHVM在使用上有很多限制。虽然HHVM对于Facebook和很多开发者来说是一个非常好的工具,但是对于PHP项目来说,HHVM的使用范围还不够广泛,只能满足Facebook或者Wikipedia等特定项目的需求。对于非强类型语言PHP,导入JIT就更难了。但是,给PHP加上JIT编译是非常困难的。RasmusLerdorf说,JIT必须学会识别程序的运行模式(patterns),比如知道哪些部分是重要的程序代码,并预测程序什么时候被调用,或者在程序运行之前会调用程序的哪些部分.RasmusLerdorf比喻说,在很多汽车中,JIT必须能够预测汽车的哪个部分会右转,汽车的哪个部分会左转,或者哪种颜色的汽车会直行。减少。”但是,如果预测正确,程序的性能可以大大提高。在通用编程语言的编译中加入JIT并不容易。RasmusLerdorf说,由于PHP的动态特性,添加JIT更加困难。比如开发者声明参数$a的值为1,但并不代表程序中$a的值全部为1,因为PHP中的参数值可以很容易的重新定义。在C语言中,当开发者声明参数a为整数时,那么a就永远是整数。如果程序中的任何地方声明a的类型不是整数,它甚至不会编译。而由于C语言这种强类型编程语言,“JIT可以预测变量a是一个整数,但在PHP中,我们没有这种奢侈”。他解释说,HHVM的做法是,当JIT得知a是整数类型后,就假定a永远是整数。HHVM为了使用JIT编译,一定程度上限制了PHP的发展。HHVM的使用者必须明确声明变量的性质,而使用PHP的开发者可以先声明一个没有属性的类,然后指定该类的变量属性。“没有任何限制,给PHP加上JIT就是我们要做的。”他表示,PHP必须兼顾Wordpress、Drupal等框架的开发者,不能随意停止对这些框架的支持。因此,与HHVM相比,PHP对构建JIT的限制更多。但是,“这并不意味着我们不能做JIT,另外,我们还要控制PHP的开发。”拉斯穆斯勒多夫说。目前,核心PHP贡献者之一德米特里·斯托戈夫(DmitryStogov)开发了一个JIT原型,并使用一些实验性应用程序来测试其运行。RasmusLerdorf表示,如果使用这种JIT来执行一些重复性操作或循环程序,PHP7的性能可以提高10倍。不过,他也承认,当这个实验性的JIT用于Wordpress时,并没有得到任何加速效果,“我们要构建的JIT,不是我们在大学课本上学的,而是可以在现实世界中运行的JIT”他说。因为PHP一直抱着这样的理想,试图解决人们生活中的问题,并能在现实世界的网络环境中运行,而不仅仅是教科书上的理论。RasmusLerdorf说,当PHP刚出来的时候,他每天至少花16个小时开发PHP。但目前,他已经逐渐减少了对开发的投入,转而致力于在全球范围内进行宣传和演讲。他开玩笑说:“与其自己开发,还不如鼓励比我聪明得多、愿意每天花十八小时写程序的人来开发PHP。”他说他的最终目标是PHP没有一行是他写的。程序代码,“任何成长中的项目都不应由一个开发人员主导,旧的程序代码应该被新的程序代码取代。”并且他认为其他开发人员应该以此为目标。