¿Cuál es la diferencia de rendimiento (si hay alguna) entre estos tres enfoques, ambos utilizados para transformar una matriz en otra matriz?
- Utilizando
foreach
- Utilizando
array_map
con la función lambda / cierre - Usar
array_map
con la función / método 'estático' - ¿Hay algún otro enfoque?
Para aclararme, echemos un vistazo a los ejemplos, todos haciendo lo mismo: multiplicando la matriz de números por 10:
$numbers = range(0, 1000);
Para cada
$result = array();
foreach ($numbers as $number) {
$result[] = $number * 10;
}
return $result;
Mapa con lambda
return array_map(function($number) {
return $number * 10;
}, $numbers);
Mapa con función 'estática', pasado como referencia de cadena
function tenTimes($number) {
return $number * 10;
}
return array_map('tenTimes', $numbers);
¿Hay algún otro enfoque? Estaré encantado de escuchar en realidad todas las diferencias entre los casos de arriba, y cualquier entrada por la cual se debe usar uno en lugar de otros.
Respuestas:
FWIW, acabo de hacer el punto de referencia ya que el póster no lo hizo. Se ejecuta en PHP 5.3.10 + XDebug.
ACTUALIZACIÓN 2015-01-22 compare con la respuesta de mcfedr a continuación para obtener resultados adicionales sin XDebug y una versión PHP más reciente.
Obtengo resultados bastante consistentes con números 1M en una docena de intentos:
Suponiendo que la velocidad mediocre del mapa en el cierre fue causada por el cierre posiblemente evaluado cada vez, también probé así:
Pero los resultados son idénticos, lo que confirma que el cierre solo se evalúa una vez.
02/02/2014 ACTUALIZACIÓN: volcado de códigos de operación
Aquí están los volcados de código de operación para las tres devoluciones de llamada. Primero
useForeach()
:Entonces el
useMapClosure()
y el cierre que llama:
entonces la
useMapNamed()
función:y la función nombrada que llama
_tenTimes()
:fuente
useMapNamed
realidad es más rápido queuseArray
. Pensé que valía la pena mencionarlo.lap
, ¿no quieres larange()
llamada sobre la primera llamada de microtiempo? (Aunque probablemente sea insignificante en comparación con el tiempo para el ciclo.)Es interesante ejecutar este punto de referencia con xdebug deshabilitado, ya que xdebug agrega bastante sobrecarga, especialmente a las llamadas de función.
Este es el script de FGM ejecutado usando 5.6 con xdebug
Sin xdebug
Aquí solo hay una pequeña diferencia entre la versión foreach y la versión de cierre.
También es interesante agregar una versión con un cierre con un
use
A modo de comparación agrego:
Aquí podemos ver que tiene un impacto en la versión de cierre, mientras que la matriz no ha cambiado notablemente.
19/11/2015 También he agregado resultados usando PHP 7 y HHVM para comparar. Las conclusiones son similares, aunque todo es mucho más rápido.
fuente
array_map
(y sus funciones relacionadasarray_reduce
,array_filter
) le permiten escribir código hermoso. Siarray_map
fuera mucho más lento, sería una razón para usarloforeach
, pero es muy similar, por lo quearray_map
usaré en todas partes, tiene sentido.Es interesante. Pero obtuve un resultado opuesto con los siguientes códigos que se simplifican de mis proyectos actuales:
Aquí están mis datos y códigos de prueba:
El resultado es:
Mis pruebas fueron en el entorno de producción de LAMP sin xdebug. Estoy deambulando xdebug ralentizaría el rendimiento de array_map.
fuente
array_map
;)array_map
yforeach
uso de Xhprof. Y es interesante quearray_map
consume más memoria que `foreach`.