php - una - array_map vs loop y operación
php array_walk use (2)
Utilizando:
for($i=1; $i<= 10000; ++$i) {
$arrayOfNumbers[] = rand(1, 99999);
}
¿Pueden algunos explicar por qué existe tal diferencia de velocidad?
array_map(array($maxHeap, ''insert''), $arrayOfNumbers);
# Avg Time: 0.92856907844543s
# against
foreach($arrayOfNumbers as $number) {
$maxHeap->insert($number);
}
# Avg Time: 1.3148670101166
$maxHeap
es una class MaxHeap extends SplMaxHeap
objeto class MaxHeap extends SplMaxHeap
Por lo que sé, php no hace nada asincrónicamente, en contraste con la respuesta de Sajith Amma.
Sospecho que esto se debe a diferencias en la búsqueda de $maxHeap->insert
.
Con el bucle foreach
el que está llamando a $maxHeap->insert
dentro del alcance actual, el intérprete de php tiene que buscar maxHeap
luego la insert
búsqueda en la instancia de maxHeap
. Dentro del alcance de la secuencia de comandos que está ejecutando puede haber otras variables que pueden hacer que la búsqueda sea más lenta.
Con el array_map
el intérprete php sabe que llamará exactamente a la misma $maxHeap->insert
, puede hacer la búsqueda una sola vez y usar la misma "dirección de código" para el resto de las iteraciones.
Se debe a la diferencia entre las funciones de devolución de llamada y las funciones normales.
En el segundo, iteración de matriz utilizando foreach, cada iteración llama a la función "insertar" y espera la ejecución (control de devolución de función) y continúa con la siguiente iteración.
Pero en la función array_map, "insert" sucede como función de devolución de llamada, llama a "insert" y no espera el resultado y llama a insert con el siguiente elemento en la matriz. Entonces es más rápido.
Espero eso ayude.