2011-12-30 12 views
11

Estoy empezando a utilizar paradigmas de programación funcional en php y me preguntaba cuáles son los impactos en el rendimiento. Algunos google simplemente parece decir que hay algunos. Para ser específico, me gustaría saber:rendimiento de la función anónima en PHP

  • ¿Hay realmente un impacto en el rendimiento o es una leyenda urbana?
  • ¿Cuál es el impacto en el rendimiento (es de esperar que alguien haya hecho benchmarks)?
  • ¿Qué causa este impacto (si existe)?
  • ¿Tiene un costo fijo o por ejecución?

cualquier recurso que ustedes han sería muy apreciada :)

Gracias de antemano

+0

Esta respuesta es el principal resultado de Google para "funcionamiento de la función anónima de php" https://hackernoon.com/the-decline-of-stack-overflow-7cb69faa575d – jchook

Respuesta

17

hice algunas pruebas con array_map(), llamándola con:

  1. El nombre de una función (array_map('test', $myArray);)
  2. una variable que contiene un cierre (array_map($test, $myArray);)
  3. Un cierre (array_map(function{}(), $myArray);)

En los tres casos, la función estaba vacío (function test(){})

Los resultados para una matriz con 1.000.000 de artículos ($myArray = range(1,1000000);)

Function: 0.693s 
Variable:0.703s 
Closure: 0.694s 

Para una matriz de 10.000.000 de artículos, los resultados son los siguientes:

Function: 8.913s 
Variable: 8.169s 
Closure: 8.117s 

Entonces, en ninguno de los casos tenemos demasiados gastos generales, si los hay.

Vea también el 4º comentario en http://fabien.potencier.org/article/17/on-php-5-3-lambda-functions-and-closures Llega a las mismas conclusiones. En ese comentario, también ves que create_function() es significativamente más lento.

+0

Nice answer. Tenga en cuenta también que create_function siempre debe analizar el php en tiempo de ejecución, por lo que perderá mucho tiempo si utiliza el almacenamiento en caché de opcode. – symcbean

+0

Pero, ¿qué pasa con el equivalente completamente no funcional 'foreach ($ myArray as $ foo) {}'? :) – deceze

+1

Acabo de hacer la prueba 10.000.000: 4.780s Esperaba que fuera * bit * más rápido, pero este es un * lote *. (aunque algunas repeticiones rápidas de las otras versiones sugieren que ahora también son un poco más rápidas, pero en el estadio secundario). Para hacer las cosas bien, hice 'foreach ($ a AS $ i) {test ($ i);} ', ya que" hace lo mismo "que las llamadas a' array_map()'. –

Cuestiones relacionadas