Подтвердить что ты не робот

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

4b9b3361

Ответ 1

Это связано с различием между функциями обратного вызова и нормальными функциями.

Во втором, итерация массива с использованием foreach, каждая итерация вызывает функцию "вставить" и ждет выполнения (возврат функции функции) и переходит к следующей итерации.

Но в функции array_map "вставка" происходит как функция обратного вызова, она вызывает "вставить" и не дожидается результата и вызывает вставку со следующим элементом массива. Так что это быстрее.

Надеюсь, что это поможет.

Ответ 2

Насколько мне известно, php не делает ничего асинхронно, в отличие от ответа Саджита Амма.

Я подозреваю, что это происходит из-за различий в поиске $maxHeap->insert.

В цикле foreach вы вызываете $maxHeap->insert в пределах текущей области, интерпретатор php должен искать maxHeap, а затем искать insert в экземпляре maxHeap. В рамках script, который вы используете, могут быть другие переменные, которые могут замедлить поиск.

С помощью array_map интерпретатор php знает, что он будет вызывать тот же самый $maxHeap->insert, он может выполнить поиск только один раз и использовать тот же "кодовый адрес" для остальных итераций.