使用:
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
答案 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”并且不等待结果并调用插入数组中的下一项。所以它更快。
希望它有所帮助。