![]() |
1
46
函数调用在PHP中是昂贵的,因为有很多事情要做。
请注意
对于这样一个简单的程序:
有六个操作码(每个参数有四个+一个): 1 INIT_FCALL_BY_NAME 'func', 'func' 2 EXT_FCALL_BEGIN 3 SEND_VAL 'arg1' 4 SEND_VAL 'arg2' 5 DO_FCALL_BY_NAME 2 6 EXT_FCALL_END
您可以在中检查操作码的实现
|
![]() |
2
5
调用用户函数的开销真的那么大吗?或者说现在真的有那么大了?自从最初提出这个问题以来,PHP和计算机硬件在近7年里都有了飞跃性的发展。
在基于2016 vintage i5的桌面(更具体地说,Intel Core i5-6500 CPU@3.20GHz 4)上的PHP 7结果如下: 内联调用mt_rand()花费了3.51816201202秒 调用用户函数花费了7.2354700565338秒 micro-optimisation 这对于增加源代码的复杂性几乎不会产生任何有意义的性能好处。 如果您的PHP脚本速度慢,那么几乎可以肯定的是,这将归结于I/O或糟糕的算法选择,而不是函数调用开销。连接到数据库、执行CURL请求、写入文件,甚至只是回显到stdout,这些都比调用用户函数要贵几个数量级。如果你不相信我,让mt\u rand和myfunc回显它们的输出,看看脚本运行得有多慢!
|
![]() |
3
4
我认为他们不是。实际上,您根本没有测试函数调用。您正在测试低级越界检查(isset)和遍历字符串以计算字节数(strlen)之间的区别。 我找不到任何特定于PHP的信息,但是strlen通常是这样实现的(包括函数调用开销):
第一个是循环。第二个是一个简单的测试。 |
![]() |
4
3
函数调用是昂贵的,因为上面的@artefactor很好地解释了这个原因。请注意,它们的性能与所涉及的参数/参数的数量直接相关。这是我在开发自己的应用程序框架时非常关注的一个领域。当有可能避免函数调用时,我会这样做。
一个这样的例子是最近对
下面的快速测试对于一个数字是正确的,对于其他任何数字都是错误的。
比…快得多
|
![]() |
5
3
我认为rich remer的回答其实相当准确。你把苹果和桔子和你原来的例子作比较。试试这个:
本例中唯一的区别是函数调用本身。在100000次运行(如上所述)的情况下,我们发现使用输出中的函数调用有<1%的差异:
当然,这一切都取决于你的职能
做
你认为贵的东西
. 如果
|