array_map vs循环和操作

Liz*_*ard 35 php spl array-map

使用:

for($i=1; $i<= 10000; ++$i) {
    $arrayOfNumbers[] = rand(1, 99999);
}
Run Code Online (Sandbox Code Playgroud)

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

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

# against

foreach($arrayOfNumbers as $number) {
    $maxHeap->insert($number);
}
# Avg Time: 1.3148670101166
Run Code Online (Sandbox Code Playgroud)

$maxHeap 是一个对象 class MaxHeap extends SplMaxHeap

Jar*_*oss 14

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

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

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

随着array_mapphp解释器知道它将调用完全相同$maxHeap->insert,它只能执行一次查找并在其余迭代中使用相同的"代码地址".


Saj*_*mma 2

这是由于回调函数和普通函数之间的差异造成的。

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

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

希望能帮助到你。

  • 我也强烈怀疑 php 异步运行调用。-1,因为缺乏良好的参考。 (9认同)