HHVM提升PHP执行性能原理

2017年05月01日 | 作者:hhvm君 | 分类:原理解读

#HHVM

《Hack与HHVM权威指南》一书,已经在各大网店公开发售!

HHVM之所以能够大幅度提升PHP的性能,其秘诀究竟是什么呢?我们这里稍稍探查一下其秘诀之一。先看一段较为官方的描述:“HHVM生成和执行PHP的中间字节码(HHVM生成自己格式的中间字节码),执行时通过JIT(Just In Time,即时编译是种软件优化技术,指在运行时才会去编译字节码为机器码)转为机器码执行。JIT将大量重复执行的字节码在运行的时候编译为机器码,达到提高执行效率的目的。通常,触发JIT的条件是代码或者函数被多次重复调用。”

HHVM执行PHP程序的时候,引入了一个JIT的概念。那么什么是JIT呢?

其英文单词的全拼是“Just In Time”,翻译成中文就是即时编译。只在运行的时候,才会去编译字节码为机器码来执行。

那么字节码是什么?

额,全称是中间字节码。就是我们通常所编写的PHP代码的进一步演化的结果。

我们知道,PHP之类的是高级语言,而C语言之类的呢,就是基础语言。PHP语言的背后呢,其实是C语言,那些PHP的扩展dll/so之类的,都是C语言编写的。再往深处研究的话,所有的语言都可以深究为汇编语言。不信的话,大家可以去拿olydebug去跟踪一下,您只能知晓的任何语言的程序。看看,是不是全是push add之类的指令。那么汇编的再底层的话,就是01010101001这样的二进制了。好吧。说多了,汇编级别的,已经是天书了。这种01001的二进制就更加是天书了。还记得以前有个笑话来着么,有个计算机天才去给女神修电脑装系统,弄了一晚上没动静,结果一看,天才正在给拿针010101的给女神刻系统盘呢.....

我们再来看看zend引擎的做法:

Zend引擎默认做法,是先编译为opcode,然后再逐条 执行,通常每条指令对应的是C语言级别的函数。如果我们产生大量重复的opcode(纯PHP写的代码和函数),对应的则是Zend多次逐条执行这些C代码。

HHVM生成和执行PHP的中间字节码(HHVM生成自己格式的中间字节码),执行时通过JIT(Just In Time,即时编译是种软件优化技术,指在运行时才会去编译字节码为机器码)转为机器码执行。JIT将大量重复执行的字节码在运行的时候编译为机器码,达到提高执行效率的目的。通常,触发JIT的条件是代码或者函数被多次重复调用。

《Hack与HHVM权威指南》中有这样一些描述。大意是:HHVM如果想要达到最好的效果,需要给他热身一下。就是说在运行初期,要对其做出“热身”调用,就是模拟出最可能的,最大多数情况的调用。然后,HHVM的优化效果才会得以体现。

我们理解上就是,先把常用的函数多次反复调用,以触发JIT。达到热身的目的,其实说白了,就像考试一下,考试之前,先温习一下考题。真正考试的时候,也许就执行给出答案了。您说,是不是这个道理?

【http://hhvm.news】欢迎您转载本站内容,转载请注明来自HHVM.News(http://hhvm.news/)