Array_map против цикла и операции
Использование:
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
Это связано с различием между функциями обратного вызова и нормальными функциями.
Во втором, итерация массива с использованием foreach, каждая итерация вызывает функцию "вставить" и ждет выполнения (возврат функции функции) и переходит к следующей итерации.
Но в функции array_map "вставка" происходит как функция обратного вызова, она вызывает "вставить" и не дожидается результата и вызывает вставку со следующим элементом массива. Так что это быстрее.
Надеюсь, что это поможет.
Ответ 2
Насколько мне известно, php не делает ничего асинхронно, в отличие от ответа Саджита Амма.
Я подозреваю, что это происходит из-за различий в поиске $maxHeap->insert
.
В цикле foreach
вы вызываете $maxHeap->insert
в пределах текущей области, интерпретатор php должен искать maxHeap
, а затем искать insert
в экземпляре maxHeap
. В рамках script, который вы используете, могут быть другие переменные, которые могут замедлить поиск.
С помощью array_map
интерпретатор php знает, что он будет вызывать тот же самый $maxHeap->insert
, он может выполнить поиск только один раз и использовать тот же "кодовый адрес" для остальных итераций.