Php 数组映射与循环和操作
使用:Php 数组映射与循环和操作,php,spl,array-map,Php,Spl,Array Map,使用: $maxHeap作为对象类maxHeap扩展了SplMaxHeap这是由于回调函数和普通函数之间的差异 在第二个迭代中,使用foreach对数组进行迭代,每次迭代调用“insert”函数并等待执行(函数返回控制),然后继续下一次迭代 但是在array_map函数中,“insert”作为回调函数出现,它调用“insert”,不等待结果,而是使用数组中的下一项调用insert。所以速度更快 希望能有所帮助。据我所知,与Sajith Amma的回答相比,php没有异步执行任何操作 我怀疑这实际
$maxHeap
作为对象类maxHeap扩展了SplMaxHeap
这是由于回调函数和普通函数之间的差异
在第二个迭代中,使用foreach对数组进行迭代,每次迭代调用“insert”函数并等待执行(函数返回控制),然后继续下一次迭代
但是在array_map函数中,“insert”作为回调函数出现,它调用“insert”,不等待结果,而是使用数组中的下一项调用insert。所以速度更快
希望能有所帮助。据我所知,与Sajith Amma的回答相比,php没有异步执行任何操作 我怀疑这实际上是由于
$maxHeap->insert
的查找不同造成的
使用当前范围内调用的foreach
循环$maxHeap->insert
,php解释器必须查找maxHeap
,然后在maxHeap
实例上查找insert
。在您正在运行的脚本范围内,可能有其他变量会使查找速度变慢
使用
array\u map
php解释器知道它将调用完全相同的$maxHeap->insert
,它可以只执行一次查找,并在剩余的迭代中使用相同的“代码地址”。如果您要进行否决投票,请给出原因!有趣的问题,据我所知,PHP的array\u map()
在内部表示为foreach
-如果我错了,请纠正我。因为每个内置函数/方法的操作码调用开销都比手动操作少array_map
是一种内置方法,它在C级而不是操作码中处理数组,然后在C.P.S中处理数组。正如我看到的$ArrayOfNumber循环。。我也必须告诉你:foreach比while快,while比for快。如果使用它来迭代数组,请使用foreach。For是最慢的,因为它每次迭代进行2次检查。首先检查结束条件,然后检查+++$i。因此,试着使用foreach(范围(11000)为$i)
而不是用于和基准.p.p.s。另外,第二个foreach中的方法调用是另一个通过操作码开销执行操作的方法。在几乎所有语言中,对象都比函数慢,包括php。因此,实际上您正在生成这个(以操作码为例):[what is$arrayOfNumbers?lookup]循环:[在foreach中获取下一个数组项][assign variable$number][$maxHeap?哦,我必须查找它][它是对象吗?我可以调用insert吗?如果不是,引发异常][我正在调用它,带参数][将该参数放入COW缓冲区][继续在insert中执行其他操作][检查返回值][无?很好。][如果可以,下一个循环]。我想知道这怎么可能是真的:array_map返回回调返回的数组…这就是“map”的行为。我还强烈怀疑php是否异步运行调用。-1,因为缺乏良好的引用。
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