array_map与回路和操作

2022-08-30 13:11:28

用:

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


答案 1

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

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

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

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


答案 2

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

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

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

希望它有帮助。


推荐