这三种方法之间的性能差异(如果有的话)是什么,它们都用于将一个数组转换为另一个数组?
- 使用
foreach
- 使用
array_map
和 lambda/闭包函数 - 将
array_map
与“静态”函数/方法一起使用 - 还有其他方法吗?
为了清楚起见,让我们看一下示例,它们都做同样的事情——将数字数组乘以 10:
$numbers = range(0, 1000);
Foreach
$result = array();
foreach ($numbers as $number) {
$result[] = $number * 10;
}
return $result;
使用 lambda 映射
return array_map(function($number) {
return $number * 10;
}, $numbers);
使用“静态”函数映射,作为字符串引用传递
function tenTimes($number) {
return $number * 10;
}
return array_map('tenTimes', $numbers);
还有其他方法吗?我很高兴听到上述案例之间的 所有 差异,以及为什么应该使用一个案例而不是其他案例的任何输入。
原文由 Pavel S. 发布,翻译遵循 CC BY-SA 4.0 许可协议
FWIW,我只是做了基准测试,因为海报没有这样做。在 PHP 5.3.10 + XDebug 上运行。
更新 2015-01-22 与 mcfedr 下面的答案进行比较,以获得没有 XDebug 和更新的 PHP 版本的其他结果。
我在十几次尝试中得到了 100 万个数字的非常一致的结果:
假设关闭时地图速度不佳是由于每次都可能评估关闭造成的,我也这样测试:
但结果是相同的,确认闭包只被评估一次。
2014-02-02 更新:操作码转储
这是三个回调的操作码转储。首先
useForeach()
:然后
useMapClosure()
以及它调用的闭包:
然后
useMapNamed()
功能:以及它调用的命名函数
_tenTimes()
: