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

百度工程师对PHP函数的实现原理及性能分析(二)
类的方法

类的原理是用户功能一样,它也被翻译操作码的电话。该类的实现,可以是一个数据结构,实现了zend_class_entry,保留该类相关的一些基本信息。这个项目是完成时编译PHP。

在zend_function一般,有一个成员称为范围,指向当前方法对应的类的zend_class_entry。PHP面向对象的实现,没有更详细介绍。在将来,我们将专门写一篇文章来解释PHP中面向对象实现的原理,就功能而言,方法实现的原理与函数完全相同,从理论上来说,它的性能是相似的,我们将在以后详细地进行性能比较。

性能比较

函数名对性能的影响

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

测试的结果如下所示
结果分析

从图中可以看出,函数名的长度对性能有一定的影响。一个长度为1的函数和一个长度为16的空函数调用,其性能是1倍。分析源代码不难找到原因。例如,如前所述,在Zend被调用,它将查询相关信息,通过函数名在全球funtion_table第一,和function_table是哈希表。作为一个必要性,较长的名字,它的时间就越长。因此,当程序实际上写的函数,即多次调用的名称不太长。

虽然函数名称长度对性能有一定的影响,但它是多少这个问题应该结合实际情况来考虑,如果一个函数本身比较复杂,那么整体性能就不显著了。一个建议是给那些被调用多次的人,函数本身有一个相对简单的函数,可以适当取一些简洁而全面的名称。

函数数对性能的影响

更多

测试方法

在以下三个环境中,函数调用测试,分析结果:1。程序只包含1个函数2。程序包含100个函数3。程序包含1000个函数,测试这三种情况下每秒可以调用的函数数。

测试的结果如下所示
结果分析

从测试结果中,我们可以看到,性能几乎是在这三种情况一样,和性能的下降是微不足道的功能数量增加。从实现原理的分析,在一个实现的唯一区别在于功能采集部分在以前的文章中提到过。,所有的功能都放在一个哈希表,和搜索效率仍然应该接近O(1)在不同的数字,所以性能差距不是很大。

不同类型函数调用的消耗

测试方法

选择用户函数、类方法、静态方法和内置函数,每个函数都不直接做任何事情,它主要测试空函数调用的消耗,测试的结果是在第二个可执行测试中去掉其他的影响,所有函数的名称长度相同。

测试的结果如下所示

结果分析

它可以从测试结果,由用户编写的PHP函数,无论类型,大约是相同的效率,在280w /当我们想到,即使是空调,内置的功能是更有效的,达到780w / S,后者是前者的3倍。它可以可以看出,内置函数调用的开销还是比用户功能低很多。从以前的原理分析,我们知道主要的差距是初始化符号表,接收参数,所以当用户调用的函数。

内置函数与用户函数的性能比较

测试方法

我们比较内置函数和用户函数的性能。在这里,我们选择了几种常用的函数,然后使用PHP进行相同功能的性能比较,在测试中,我们选择了一个典型的字符串、数学和数组进行比较。这些函数截取字符串(在),10元到2元(decbin)、最小值(MIN)和密钥(array_keys)数组中。

测试的结果如下所示
结果分析

As we can see from the test results, as we expect, the built-in function is far higher than the ordinary user function in the overall performance.In particular, for functions involving string class operations, the gap reaches 1 orders of magnitude.Therefore, one of the principles that functions use is that if a function has a corresponding built-in function, it is possible to use it as much as possible instead of writing the PHP function itself.For some functions that involve a large number of string operations, to improve performance, you can consider using extensions to implement.For example, common rich text filtering, and so on.

c函数的性能比较

测试方法

我们比较3个字符串的运算和算术运算功能,和PHP实现扩展。三功能简单的算法运算,字符串比较和多算法操作。除了功能本身的两种,而且将拆卸空调的费用后的性能测试,检查功能(C和内置的PHP)的性能差异,消费也是空调功能测试证实了10W操作消耗时间的实现

测试的结果如下所示
结果分析

PHP函数式空调的影响后,内置函数和C函数的开销较小。随着函数的功能越来越复杂,双方的性能几乎相同,这在前面功能实现的分析中很容易体现出来,毕竟内置函数是C实现,函数越复杂,C与PHP之间的性能差距就越小。PHP函数调用的开销比C.的要大得多,它对简单函数的性能有一定的影响,因此PHP中的函数不应该嵌套和封装得太深。

伪函数及其性能

在PHP中,有一些功能,这是在使用一个标准的使用功能,但底层的实现是真实的和函数调用完全不同,这些函数不属于三种功能的上述任何一类,其本质是一个单独的操作码,这里所谓的伪函数或指令函数的估计。

As mentioned above, use pseudo function and the standard function as seems to have the same characteristics.But when they were finally executed, they were reflected by Zend into a corresponding instruction (opcode) to invoke, so its implementation is closer to if, for, arithmetic operation and so on.

PHP中的伪函数

设置



撤消

eval

通过上面的介绍,我们可以看到伪函数是直接执行的,因为它直接被翻译成指令。与普通函数相比,伪功能比函数调用,那么贵,所以性能更好。我们通过以下测试做比较,array_key_exists和设置可以确定数组中存在的关键和看他们的表演。
从图中我们可以看到,与array_key_exists,isset性能比前者高出很多,大约是4倍,前者,甚至与虚函数调用,它的性能大约是1倍。这也表明,PHP函数调用的开销仍然是比较大的。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部