【问题标题】:anonymous function performance in PHP [closed]PHP中的匿名函数性能[关闭]
【发布时间】:2012-01-30 09:42:17
【问题描述】:

我开始在 php 中使用函数式编程范例,并且想知道性能影响是什么。一些谷歌搜索似乎只是说有一些。具体来说,我想知道:

  • 是否真的对性能有影响,还是只是一个都市传说?
  • 对性能有什么影响(希望有人做过基准测试)?
  • 是什么导致了这种影响(如果存在)?
  • 是固定成本还是每次执行?

你们所拥有的任何资源将不胜感激:)

提前致谢

【问题讨论】:

标签: php functional-programming php-5.3 anonymous-function


【解决方案1】:

我用 array_map() 做了一些测试,调用它:

  1. 函数的名称 (array_map('test', $myArray);)
  2. 包含闭包的变量 (array_map($test, $myArray);)
  3. 关闭 (array_map(function{}(), $myArray);)

在所有三种情况下,函数都是空的 (function test(){})

包含 1.000.000 项 ($myArray = range(1,1000000);) 的数组的结果

Function: 0.693s
Variable:0.703s
Closure: 0.694s

对于 10.000.000 个项目的数组,结果如下:

Function: 8.913s
Variable: 8.169s
Closure: 8.117s

所以在这两种情况下,我们都没有太多开销(如果有的话)。

另见http://fabien.potencier.org/article/17/on-php-5-3-lambda-functions-and-closures 上的第四条评论 得出同样的结论。在该评论中,您还看到 create_function() 的速度明显变慢。

【讨论】:

  • 不错的答案。另请注意,create_function 必须始终在运行时解析 php,因此如果使用操作码缓存,您将浪费大量时间。
  • 但是完全没有功能的等价物foreach ($myArray as $foo) { }呢? :)
  • 刚刚进行了 10.000.000 测试:4.780s 我预计它会快 bit,但这是 很多。 (尽管其他版本的一些快速重新运行表明它们现在也快了一点,但在亚秒级的范围内。)为了公平起见,我做了foreach($a AS $i) {test($i);},因为这与array_map() calls.
  • @JoryGeerts 我认为等效的 foreach 循环类似于:foreach($a as $k => $v) $a[$k] = operation_from_closure($v);
  • 这里是对所有 PHP 版本的快速测试:3v4l.org/6AABv——似乎创建一个 lambda 函数并将其存储在一个变量中可能对硬编码函数有大约 1% 的开销。使用匿名 lambda 函数而不将其存储在变量中会产生大约 15-25% 的开销。详情见gist.github.com/mikkorantalainen/…
猜你喜欢
  • 2013-06-24
  • 1970-01-01
  • 2011-07-18
  • 2012-08-03
  • 2011-05-08
  • 2011-07-18
  • 2014-09-12
  • 2015-01-27
  • 2014-09-11
相关资源
最近更新 更多