手机版

百度工程师谈PHP函数的实现原理及性能分析(2)

时间:2021-11-06 来源:互联网 编辑:宝哥软件园 浏览:

方法类方法的执行原理和用户函数一样,也是翻译成操作码,按顺序调用。类,zend使用一个数据结构zend_class_entry,它存储了一些与该类相关的基本信息。这个条目在php编译时已经被处理过了。在zend_function的公共中,有一个名为scope的成员,它指向当前方法对应的类的zend_class_entry。至于php中的面向对象实现,这里我就不做更详细的介绍了,但我会在以后专门写一篇文章,详细介绍php中的面向对象实现原理。就函数而言,方法的实现原理与函数的实现原理完全相同,理论上性能相似。稍后我们将进行详细的性能比较。

比较函数名长度对性能的影响。

测试方法比较名称长度为1、2、4、8和16的函数,测试和比较它们每秒的可执行次数,并确定函数名称长度对性能的影响。

测试结果如下02.jpg

结果分析从图中可以看出,函数名的长度仍然会对性能产生一定的影响。长度为1的函数和长度为16的空函数调用的性能相差1倍。通过分析源代码不难找到原因。如前一条语句所述,zend将首先通过fun _ table查询全局fun _ table中的相关信息,fun _ table是一个哈希表。不可避免的是,名字越长,搜索的时间就越长。因此,在实际编写程序时,建议多次调用的函数名称不要太长。

虽然函数名的长度对性能有一定的影响,但是影响有多大呢?这个问题还是需要结合实际情况来考虑。如果一个函数本身很复杂,对整体性能影响不大。一个建议是,对于那些可以多次调用且功能相对简单的函数,可以适当给出一些简洁的名称。测试方法“函数号对性能的影响”在以下三种环境下测试函数调用,分析结果为:1。程序只包含一个函数2。该程序包含100个功能。该程序包含1000个功能。测试在这三种情况下每秒可以调用的函数数量。

测试结果如下03.jpg

结果分析从测试结果可以看出,这三种情况下的性能几乎相同,当函数数量增加时,性能下降很少,可以忽略不计。从实现原理分析,几种实现的唯一区别在于功能获取。如上所述,所有函数都放在一个哈希表中,不同编号下搜索效率应该还是接近O(1),所以性能差距不大。在不同类型函数调用消耗的测试方法中,选择了用户函数、类方法、静态方法和内置函数。函数本身什么都不做,直接返回,主要测试空函数调用的消耗。测试结果是每秒可执行的次数。为了消除其他影响,所有函数都有相同的名称长度。测试结果如下。

结果分析通过测试结果可以看出,无论是哪种类型,用户编写php函数的效率都在280w/s左右。正如我们所料,即使在空调中,内置功能的效率也要高得多,达到780w/s,是前者的3倍。可以看出,内置函数调用的成本仍然比用户函数低很多。从前面的原理分析可以看出,主要差距在于用户调用函数时的初始化符号表、接收参数等操作。

内置功能和用户功能的性能比较。

> >测试内置功能和用户功能之间的性能比较。这里我们选择了几个常用的函数,然后用php实现带有相同函数的函数进行性能比较。在测试中,我们选择一个典型的字符串、数学和数组进行比较。这些函数是字符串截断(substr)、十进制到二进制(decbin)、查找最小值(min)和返回数组中的所有键(array _ keys)。测试结果如下30-1.jpg

结果分析从测试结果可以看出,正如我们所料,内置功能在整体性能上远远高于普通用户功能。尤其是涉及字符串类操作的函数,差距已经达到了一个数量级。因此,使用函数的原则之一是,如果一个函数有相应的内置函数,尽量使用它,而不是自己编写php函数。对于一些涉及大量字符串操作的函数,为了提高性能,我们可以考虑使用扩展来实现它们。比如常见的富文本过滤。和c函数。

”“测试方法:我们选择字符串运算和算术运算三种函数进行比较,php是通过扩展实现的。这三个函数是简单的一次算术运算、字符串比较和多次算术运算。除了自身的两类功能外,还会测试该功能的空调开销去掉后的性能。一方面比较两种功能(内置C和php)的性能差异,另一方面横向验证空调功能的消耗测试点是执行10w操作的时间消耗。测试结果如下30-2.jpg

结果去除php函数对空调的影响后,内置函数和C函数的成本差异较小。随着功能变得越来越复杂,双方的表现也趋于一致。这一点从前面对函数实现的分析可以很容易的论证出来,毕竟内置函数是C实现的,函数越复杂,C和php的性能差距就越小。与C相比,php函数调用的成本要高得多,简单函数的性能仍然受到影响。因此,php中的函数不应该嵌套和封装得太深。伪函数及其性能。

在php中,有一些函数,它们是正在使用的标准函数,但是底层实现与真正的函数调用完全不同。这些函数不属于上面提到的三个函数中的任何一个,但本质上是一个操作码,它在这里被估计并被称为伪函数或指令函数。

如上所述,伪函数与使用中的标准函数没有什么不同,它们似乎具有相同的特征。然而,当它们最终被执行时,它们被zend反映为要调用的相应指令(操作码),因此它们的实现更接近if、for、算术运算等。php中的伪函数issetemptyunseteval从上面的介绍可以看出,伪函数是直接翻译成指令执行的,相比普通函数减少了函数调用带来的开销,所以性能会更好。让我们通过下面的测试来做一个比较。Array_key_exists和isset都可以判断数组中是否存在一个键,看看它们的性能30-3.jpg

从图中可以看出,isset的性能远高于array_key_exists,约为前者的4倍,性能比null函数调用高1倍左右。这也证实了php函数调用的开销还是比较大的。

版权声明:百度工程师谈PHP函数的实现原理及性能分析(2)是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。