PHP 霸主地位被动摇,JIT 是穷途末路后的绝地反击?

来自:开源中国

链接:https://my.oschina.net/editorial-story/blog/1604717

摘要: PHP 是 Web 开发最常用的语言,自创建以来,PHP 语言经历了许多激烈的改进,其中性能是开发人员在评估新版本时考虑的主要标准之一。每个大版本的更新都会带来很多新特性和性能提升。

TIOBE 2017 年度编程语言榜单已出炉,世界上最好的语言 PHP 再度无缘年度编程语言。

距离其上次(2004 年)获得年度编程语言,已有 13 年之久。而从历年 TIOBE 编程排行榜趋势图也可以看到,自 2014 年以来,PHP 总体处于持续下滑趋势。

image

作为世界上最好的语言,PHP 的霸主地位会被撼动吗?

据 W3Techs.com 的数据显示,近年来,有超过 80% 的网站在服务器端的编程语言选择了 PHP,一门语言流行的背后必会有其原因,PHP 一开始凭借其简单上手而流行起来,而持续流行了这么多年,我们相信不仅仅是由于它的易于使用,作为一门服务器端的语言,如果性能没有足够好,很难一直被流行至今。

image

下面,我们不妨回顾下 PHP 的性能是如何演进的。

PHP 的性能演进历史

PHP 是 Web 开发最常用的语言,自 1994 年 Rasmus Lerdorf 创建 PHP 以来,PHP 语言经历了许多激烈的改进,其中性能是开发人员在评估新版本时考虑的主要标准之一。每个大版本的更新都会带来很多新特性和性能提升。

有关 PHP 性能改进的主要版本历史:

  • 1994:Rasmus Lerdorf 为了维护个人网页而制作了一个简单的用 Perl 语言编写的程序,称为 Personal Home Page

  • 1995:Rasmus Lerdorf 用 C 语言对"Personal Home Page"进行重新编写,包括可以访问数据库,并于 1995 年 6 月 8 日发布了首个公开版。这是 PHP 1.0 版本,也是第一次使用了"PHP"的名字

  • 1997:Rasmus Lerdorf、Andi Gutmans 和 Zeev Suraski 加入了该语言的第三个版本的开发,并进行根本性的重新设计,性能大大提升。从那之后, PHP 开发组也创建并发展起来。PHP 也在这个时候改称为 PHP:Hypertext Preprocessor

  • 2000:以 Zend Engine 1.0 为基础的 PHP 4 正式发布,自此,PHP 的性能才开始变得正式起来

  • 2004:发布了 PHP 5,PHP 5 使用了第二代的 Zend Engine。PHP 包含了许多新特色,如强化的面向对象功能、引入 PDO(PHP Data Objects,一个存取数据库的延伸函数库)、以及许多效能上的增强

  • 2015:12 月 3 日,PHP 7.0 正式发布,使用的 Zend Engine 3 带来了 100% 的性能提升,还有统一的变量语法,基于抽象语法树编译过程

可以看到,于 2015 年发布的 PHP 7 在性能方面取得了重大的突破。该版本最大的改进莫过于无感知的 100% 性能提升,其中包含了运行速度与内存消耗。与 PHP 5 相比,PHP 7 的综合性能提升了一倍以上。

image

PHP 7 带来的性能飞跃让开发者获益良多,使得很多应用受益,也使得 PHP 的应用场景变得更加广泛。

那么下一步 PHP 的性能提升方向是什么?下文将分享 PHP 下一个性能提升的主要举措:JIT 的进展,以及下一个大版本的 PHP 可能带来的特性。( 整理出自:2017 年 OSC 源创会年终盛典鸟哥演讲《PHP Next: JIT》)

鸟哥表示,从 PHP 7 发布到现在,在提交一些关于性能提升的工作时,阻力会变得小很多。可以说,PHP 7 是开启了 PHP 性能发展方向的一个风潮。

事实上,为一个有长远历史的程序做优化的难度比推倒重构更高。PHP 7 在性能方面带来了跨越式的提升,如果能够将这些成果应用到使用 PHP 的 Web 系统中,也许只需要更少的机器,就能支撑起更高请求量的服务。

PHP 7 之后会有什么 —— JIT

这是一个十分值得我们期待的版本,目前由 Zend 引擎的 Dmitry Stogov 主导。虽然它是基于 PHP 7.1 版本,但实际版本号尚未确定。

JIT 是什么?为什么是 JIT?

JIT (Just-In- Time 即时编译) 并非是新技术,很多语言例如 Java 早已实现。JIT 的思想很简单,即在程序运行时动态对程序进行编译,生成平台相关的机器码(比如运行它的机器 CPU 的本地代码),从而加快程序的运行速度。

为什么是 JIT?

不妨先来看看 PHP 文件的执行流程。PHP 文件的执行流程大致是首先引擎加载 PHP 文件,解释器逐条解释执行代码。

image

引入 JIT 后,前面部分一样,重点是 JIT 编译器会根据 Runtime 信息对热点代码进行动态编译生成机器码,此后这部分代码就可以直接执行,不再需要解释器逐条解释执行,因此运行效率会得到提升。

Facebook 开源的 PHP 虚拟机 HHVM(HipHop Virtual Machine) 就采用了 JIT,这让他们的 PHP 性能测试结果提升了一个数量级,也让开发者意识到 JIT 是一项点石成金的强大技术。HHVM 也是目前最热门的带 JIT 编译器的 PHP 实现。

PHP 7.1 引入了类型推断

而 PHP 要想实现 JIT,必须要解决变量的类型推断这个难题。试想,如果在动态编译时仍需要进行大量的类型检查,性能将会大幅下降。

PHP 7.1 引入了一个称作“类型推断”的特性,这是现阶段正在实现的 JIT 的前驱,但它不是单独开发的,2013 年的 PHP 5 已经实现了一套推断系统,7.1 嵌入了这套系统并对其进行优化。

PHP 7 中已经可以控制变量的类型,7.1 对这个机制进行了完善。我们甚至可以说目前的 PHP 已经是半强类型语言,但由于 PHP 的弱类型语言历史,目前仍有大量代码在运行前无法得知变量类型,所以在 7.1 中 PHP 的开发者进行了大量变量类型推断的工作,为后续的 JIT 实现打下基础。

对变量进行推断,目前比较简单的一种办法是数据流分析,即分析代码的上下文,从而推断出变量的可能类型,比如:

 function calc ($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;
 }

对于这项改进,目前依然有较多的困难,鸟哥表示他们的解决思路是对 JIT 进行分级,通过配置实现不同程度的动态编译,从而降低类型预测的难度。此外,针对具体的场景,进行垂直优化。除了基于数据流的分析,PHP 7.1 还会基于分支进行判断。

PHP 7.2 继续提升性能并完善类型推断

PHP 7.2 不久前也已发布,与 7.1 相比,它的性能有大约 10% 的提升。7.2 在数据流分析里引入了三个新特性。

  • sparse conditional constant propagation

  • 逃逸分析

  • 移除“死代码”(消除没有副作用的代码)

PHP 7.2 还包括对基于分支预测的优化,此外,还引入了称为"HYBRID VM"的虚拟机引擎。

image.png

关于 JIT 性能表现的一些数据

image.png
image.png
image.png

那么,JIT 性能的提升效果表现如何?这要取决于项目的实际瓶颈。鸟哥表示,JIT 对性能提升要看具体的情景,如果某段逻辑是计算密集型的,它的提升大概有 1/4,不过也有一些性能提升不明显的场景,如果在 IO 密集型场景下进行测试,性能的提升不会很明显,所以一定要考虑具体的使用场景。

此外,鸟哥表示,将来如果要写出更友好的代码,不妨考虑多添加一些类型提示。

最后

TIOBE 编程语言社区排行榜是编程语言流行趋势的一个指标,名次的下降一定程度反映了当前编程语言的流行趋势,但不能成为衡量一门语言是否优秀的唯一标准。有些编程语言受众领域较小,难以达到大范围的推广普及,但在它所专长的领域,发挥着独有的优势。

PHP 在服务端编程语言领域依旧占据主导地位,同时,PHP 社区组持续不断地做版本迭代更新,性能提升。下一个大版本将引入 JIT 特性,这个被奉为点石成金的技术会给 PHP 带来更好的性能,更大的发展吗?

参考:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 143,639评论 1 302
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 61,591评论 1 258
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 95,050评论 0 213
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 41,169评论 0 180
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 48,976评论 1 258
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 38,876评论 1 178
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 30,476评论 2 273
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,229评论 0 167
  • 想象着我的养父在大火中拼命挣扎,窒息,最后皮肤化为焦炭。我心中就已经是抑制不住地欢快,这就叫做以其人之道,还治其人...
    爱写小说的胖达阅读 29,095评论 6 234
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 32,579评论 0 213
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,356评论 2 215
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 30,698评论 1 232
  • 白月光回国,霸总把我这个替身辞退。还一脸阴沉的警告我。[不要出现在思思面前, 不然我有一百种方法让你生不如死。]我...
    爱写小说的胖达阅读 24,272评论 0 32
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,168评论 2 214
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 31,605评论 3 210
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,645评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,035评论 0 166
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 33,609评论 2 232
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 33,698评论 2 233

推荐阅读更多精彩内容