没有合适的资源?快使用搜索试试~ 我知道了~
HHVM是如何提升PHP性能的?
0 下载量 174 浏览量
2021-01-30
09:02:19
上传
评论
收藏 336KB PDF 举报
温馨提示
HHVM是Facebook开发的高性能PHP虚拟机,宣称比官方的快9倍,我很好奇,于是抽空简单了解了一下,并整理出这篇文章,希望能回答清楚两方面的问题:1.HHVM到底靠谱么?是否可以用到产品中?2.它为什么比官方的PHP快很多?到底是如何优化的?在讨论HHVM实现原理前,我们先设身处地想想:假设你有个PHP写的网站遇到了性能问题,经分析后发现很大一部分资源就耗在 PHP上,这时你会怎么优化PHP性能?方案1,迁移到性能更好的语言上,如Java、C++、Go。方案2,通过RPC将功能分离出来用其它语言实
资源推荐
资源详情
资源评论































HHVM是如何提升是如何提升PHP性能的?性能的?
背景
HHVM 是 Facebook 开发的高性能 PHP 虚拟机,宣称比官方的快9倍,我很好奇,于是抽空简单了解了一下,并整理出这篇
文章,希望能回答清楚两方面的问题:
1.HHVM 到底靠谱么?是否可以用到产品中?
2.它为什么比官方的 PHP 快很多?到底是如何优化的?
你会怎么做?
在讨论 HHVM 实现原理前,我们先设身处地想想:假设你有个 PHP 写的网站遇到了性能问题,经分析后发现很大一部分资
源就耗在 PHP 上,这时你会怎么优化 PHP 性能?
比如可以有以下几种方式:
方案1,迁移到性能更好的语言上,如 Java、C++、Go。
方案2,通过 RPC 将功能分离出来用其它语言实现,让 PHP 做更少的事情,比如 Twitter 就将大量业务逻辑放到了 Scala
中,前端的 Rails 只负责展现。
方案3,写 PHP 扩展,在性能瓶颈地方换 C/C++。
方案4,优化 PHP 的性能。
方案1几乎不可行,十年前 Joel 就拿 Netscape 的例子警告过,你将放弃是多年的经验积累,尤其是像 Facebook 这种业务逻
辑复杂的产品,PHP 代码实在太多了,据称有2千万行(引用自 [PHP on the Metal with HHVM]),修改起来的成本恐怕比写
个虚拟机还大,而且对于一个上千人的团队,从头开始学习也是不可接受的。
方案2是最保险的方案,可以逐步迁移,事实上 Facebook 也在朝这方面努力了,而且还开发了 Thrift 这样的 RPC 解决方
案,Facebook 内部主要使用的另一个语言是 C++,从早期的 Thrift 代码就能看出来,因为其它语言的实现都很简陋,没法在
生产环境下使用。
目前在 Facebook 中据称 PHP:C++ 已经从 9:1 增加到 7:3 了,加上有 Andrei Alexandrescu 的存在,C++ 在 Facebook 中越
来越流行,但这只能解决部分问题,毕竟 C++ 开发成本比 PHP 高得多,不适合用在经常修改的地方,而且太多 RPC 的调用
也会严重影响性能。
方案3看起来美好,实际执行起来却很难,一般来说性能瓶颈并不会很显著,大多是不断累加的结果,加上 PHP 扩展开发成
本高,这种方案一般只用在公共且变化不大的基础库上,所以这种方案解决不了多少问题。
可以看到,前面3个方案并不能很好地解决问题,所以 Facebook 其实没有选择的余地,只能去考虑 PHP 本身的优化了。
更快的 PHP
既然要优化 PHP,那如何去优化呢?在我看来可以有以下几种方法:
方案1,PHP 语言层面的优化。
方案2,优化 PHP 的官方实现(也就是 Zend)。
方案3,将 PHP 编译成其它语言的 bytecode(字节码),借助其它语言的虚拟机(如 JVM)来运行。
方案4,将 PHP 转成 C/C++,然后编译成本地代码。
方案5,开发更快的 PHP 虚拟机。
PHP 语言层面的优化是最简单可行的,Facebook 当然想到了,而且还开发了 XHProf 这样的性能分析工具,对于定位性能瓶
颈是很有帮助的。
不过 XHProf 还是没能很好解决 Facebook 的问题,所以我们继续看,接下来是方案2,简单来看,Zend 的执行过程可以分为
两部分:将 PHP 编译为 opcode、执行 opcode,所以优化 Zend 可以从这两方面来考虑。
优化 opcode 是一种常见的做法,可以避免重复解析 PHP,而且还能做一些静态的编译优化,比如 Zend Optimizer Plus,但
由于 PHP 语言的动态性,这种优化方法是有局限性的,乐观估计也只能提升20%的性能。另一种考虑是优化 opcode 架构本
身,如基于寄存器的方式,但这种做法修改起来工作量太大,性能提升也不会特别明显(可能30%?),所以投入产出比不
高。
另一个方法是优化 opcode 的执行,首先简单提一下 Zend 是如何执行的,Zend 的 interpreter(也叫解释器)在读到 opcode
后,会根据不同的 opcode 调用不同函数(其实有些是 switch,不过为了描述方便我简化了),然后在这个函数中执行各种语

言相关的操作(感兴趣的话可看看深入理解 PHP 内核这本书),所以 Zend 中并没有什么复杂封装和间接调用,作为一个解
释器来说已经做得很好了。
想要提升 Zend 的执行性能,就需要对程序的底层执行有所解,比如函数调用其实是有开销的,所以能通过 Inline threading
来优化掉,它的原理就像 C 语言中的 inline 关键字那样,但它是在运行时将相关的函数展开,然后依次执行(只是打个比
方,实际实现不太一样),同时还避免了 CPU 流水线预测失败导致的浪费。
另外还可以像 JavaScriptCore 和 LuaJIT 那样使用汇编来实现 interpreter,具体细节建议看看 Mike 的解释
但这两种做法修改代价太大,甚至比重写一个还难,尤其是要保证向下兼容,后面提到 PHP 的特点时你就知道了。
开发一个高性能的虚拟机不是件简单的事情,JVM 花了10多年才达到现在的性能,那是否能直接利用这些高性能的虚拟机来
优化 PHP 的性能呢?这就是方案3的思路。
其实这种方案早就有人尝试过了,比如 Quercus 和 IBM 的 P8,Quercus 几乎没见有人使用,而 P8 也已经死掉了。
Facebook 也曾经调研过这种方式,甚至还出现过不靠谱的传闻 ,但其实 Facebook 在2011年就放弃了。
因为方案3看起来美好,但实际效果却不理想,按照很多大牛的说法(比如 Mike),VM 总是为某个语言优化的,其它语言在
上面实现会遇到很多瓶颈,比如动态的方法调用,关于这点在 Dart 的文档中有过介绍,而且据说 Quercus 的性能与
Zend+APC 比差不了太多([来自The HipHop Compiler for PHP]),所以没太大意义。
不过 OpenJDK 这几年也在努力,最近的 Grall 项目看起来还不错,也有语言在上面取得了显著的效果,但我还没空研究
Grall,所以这里无法判断。
接下来是方案4,它正是 HPHPc(HHVM 的前身)的做法,原理是将 PHP 代码转成 C++,然后编译为本地文件,可以认为
是一种 AOT(ahead of time)的方式,关于其中代码转换的技术细节可以参考 The HipHop Compiler for PHP 这篇论文,以
下是该论文中的一个截图,可以通过它来大概了解:
这种做法的最大优点是实现简单(相对于一个 VM 来说),而且能做很多编译优化(因为是离线的,慢点也没事),比如上面
的例子就将- 1优化掉了,但它很难支持 PHP 中的很多动态的方法,如 eval()、create_function(),因为这就得再内嵌一个
interpreter,成本不小,所以 HPHPc 干脆就直接不支持这些语法。
除了 HPHPc,还有两个类似的项目,一个是 Roadsend,另一个是 phc ,phc 的做法是将 PHP 转成了 C 再编译,以下是它
将 file_get_contents($f) 转成 C 代码的例子:
《这里有点要特别说明的地方》
话说 phc 作者曾经在博客上哭诉,说他两年前就去 Facebook 演示过 phc 了,还和那里的工程师交流过,结果人家一发布就
火了,而自己忙活了4年却默默无闻,现在前途渺茫。。。
Roadsend 也已经不维护了,对于 PHP 这样的动态语言来说,这种做法有很多的局限性,由于无法动态 include,Facebook
将所有文件都编译到了一起,上线时的文件部署居然达到了 1G,越来越不可接受了。
另外有还有一个叫 PHP QB 的项目,由于时间关系我没有看,感觉可能是类似的东东。
所以就只剩下一条路了,那就是写一个更快的 PHP 虚拟机,将一条黑路走到底,或许你和我一样,一开始听到 Facebook 要
做一个虚拟机是觉得太离谱,但如果仔细分析就会发现其实也只有这样了。
更快的虚拟机
HHVM 为什么更快?在各种新闻报道中都提到了 JIT 这个关键技术,但其实远没有那么简单,JIT 不是什么神奇的魔法棒,用
它轻轻一挥就能提升性能,而且 JIT 这个操作本身也是会耗时的,对于简单的程序没准还比 interpreter 慢,最极端的例子是
LuaJIT 2 的 Interpreter 就稍微比 V8 的 JIT 快,所以并不存在绝对的事情,更多还是在细节问题的处理上,HHVM 的发展历
史就是不断优化的历史,你可以从下图看到它是如何一点点超过 HPHPc 的:
剩余6页未读,继续阅读
资源评论


weixin_38674569
- 粉丝: 3
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- (源码)基于Python语言的forestpy项目.zip
- 计算机系统结构课程中模拟Tomasulo算法动态调度机制的实验项目-动态指令调度-寄存器重命名-保留站-公共数据总线-乱序执行-分支预测-流水线冲突解决-性能优化分析用于深入理解-.ZIP
- (源码)基于GNU make的C语言编程学习教程.zip
- (源码)基于Node.js的B站动态抽奖自动化脚本.zip
- 从零开始实现视觉SLAM与机器人算法的Python实践教程-包含ORB特征点提取对极几何视觉里程计后端优化三维重建Otsu二值化贝叶斯滤波连通域标记目标跟踪等完整S.zip
- (源码)基于React框架的通用前端模板工程.zip
- Java+MySQL+vuejs健身房管理系统、健身房会员管理系统
- gqy20-SLAIS-62936-1753627358636.zip
- 基于物联网与人工智能技术的智慧办公室综合管理系统-集成环境监测-智能门禁-自动化考勤-会议预约-能耗管理-设备远程控制-数据分析可视化-移动办公应用-多终端协同-云端数据同步-智能.zip
- jdh-algo-JoyDataForge-5912-1753356682062.zip
- java毕业设计,广告管理系统
- 基于DeepSeek-API的AI专业术语智能翻译服务系统-人工智能-机器学习-深度学习-自然语言处理-专业术语库-英汉互译-论文翻译-文档翻译-技术文档-学术研究-科研辅助-精准.zip
- forthespada-Awsome-Courses-19764-1752995359733.zip
- Java图书馆座位管理系统
- 基于SpringSpringMVCMyBatis框架开发的高校学生宿舍综合管理系统-包含宿舍分配-水电费管理-访客登记-报修处理-卫生检查等功能模块-用于高校后勤部门对学生宿舍.zip
- HNU2024春季计算机系统课程配套代码仓库-包含CSAPP教材配套实验代码和课堂实例-用于计算机系统原理教学和实验-汇编语言-C语言-计算机组成原理-操作系统基础-处理器架构-内.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
