36

使用:

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

4

2 回答 2

14

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

我怀疑这实际上是由于$maxHeap->insert.

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

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

于 2013-04-09T08:34:13.647 回答
2

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

在第二种情况下,使用foreach对数组进行迭代,每次迭代调用“插入”函数并等待执行(函数返回控制)并进行下一次迭代。

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

希望能帮助到你。

于 2011-12-16T15:50:12.313 回答