php - array_map vs 循环和操作

标签 php spl array-map

使用:

for($i=1; $i<= 10000; ++$i) {
    $arrayOfNumbers[] = rand(1, 99999);
}

有人可以解释为什么会有这样的速度差异吗:

array_map(array($maxHeap, 'insert'), $arrayOfNumbers);
# Avg Time: 0.92856907844543s

# against

foreach($arrayOfNumbers as $number) {
    $maxHeap->insert($number);
}
# Avg Time: 1.3148670101166

$maxHeap 是一个对象 class MaxHeap extends SplMaxHeap

最佳答案

据我所知,与 Sajith Amma 的回答相反,php 不会异步执行任何操作。

我怀疑这实际上是由于 $maxHeap->insert 的查找不同造成的。

通过 foreach 循环,您在当前范围内调用 $maxHeap->insert,php 解释器必须查找 maxHeap然后在 maxHeap 实例上查找 insert。在您正在运行的脚本范围内,可能存在其他变量,这些变量会使查找速度变慢。

使用 array_map php 解释器知道它将调用完全相同的 $maxHeap->insert,它可以只进行一次查找并使用相同的“代码”地址'用于其余的迭代。

关于php - array_map vs 循环和操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8395909/

相关文章:

php - CodeIgniter current_url 不显示查询字符串

php - 从具有额外参数的扩展 RecursiveIterator 循环 RecursiveIteratorIterator

php - 为什么以 null 作为回调的 array_map() 创建一个 "array of arrays"?

php - array_map 二维数组到一维关联数组

php(模糊)搜索匹配

php - OpenCart 3. 修复 fatal error : Uncaught Error: Class 'Controllerextensionpaymentgcash' not found in storage\modification\system\engine\action. php:71

javascript - 使用下拉菜单显示 2 个不同的数据表

informix - 在 Informix SPL 过程中休眠

php - 在 PHP 中使用 array_search 使对象可搜索

php - 有没有办法在 array_map 输出上有命名索引?