array_map vs循环和操作

时间:2011-12-06 05:50:51

标签: 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

2 个答案:

答案 0 :(得分:14)

据我所知,与Sajith Amma的回答相反,php不会异步做任何事情。

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

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

使用array_map php解释器知道它将调用完全相同的$maxHeap->insert,它只能执行一次查找,并在其余迭代中使用相同的“代码地址”。 / p>

答案 1 :(得分:2)

这是由于回调函数和普通函数之间的区别。

在第二个中,使用foreach迭代数组,每次迭代调用“insert”函数并等待执行(函数返回控制)并继续下一次迭代。

但是在array_map函数中,“insert”作为回调函数发生,它调用“insert”并且不等待结果并调用插入数组中的下一项。所以它更快。

希望它有所帮助。