2009-12-31 12 views
5

Recientemente he visto en algunos lugares que la gente dice que PHP tiene una capacidad de recursión baja. Recientemente, escribí una función recursiva de php para el cruce de gráficos y encontré que es muy lenta en comparación con Java. No sé si esto se debe a la capacidad de recurrencia de php o porque php es más lento que Java en general.Capacidad de PHP para manejar la recursión

algunas google reveló esta (http://bugs.php.net/bug.php?id=1901)

[7 Ago de 1999 24:25 GMT] Zeev en CVS punto punto php neta

PHP 4.0 (Zend) utiliza la pila para grandes volúmenes de datos, en lugar de usar el montón . Eso significa que sus funciones recursivas de tolerancia son significativamente menores a que las de otros idiomas.

Es relativamente fácil de decir Zend no utilizar la pila para obtener estos datos, y usar el montón vez - lo que aumentar en gran medida el número de posibles funciones recursivas - en el precio de velocidad reducida. Si tiene interesado en dicha configuración, déjeme saber , podemos agregar un modificador en tiempo de compilación.

¿Qué significa decir que php usa la pila para datos intensivos? ¿Php no configura una pila en tiempo de ejecución? Además, ¿es cierto en general que la recursión en php es mucho más lenta que otros lenguajes? ¿Y por cuánto?

Gracias!

+6

Santos antigua bugs cerrados ayudante personal! – cgp

+2

altCognito tiene un punto. ¿Estás usando PHP4? ¿O estás en 5? – fennec

Respuesta

2

Bien, voy a intentarlo.

Primero: "La pila" es el área utilizada para el seguimiento de llamadas de función en programas estándar de tipo C/C++. Es un lugar que el sistema operativo y las convenciones del lenguaje de programación definen en la memoria, y se trata como una pila (la estructura de datos). Cuando llama a una función C fibbonaci(int i), coloca la variable i, y la dirección de retorno de la función que ya estaba ocupada llamándola, en la pila. Eso requiere algo de memoria. Cuando se hace con esa llamada de función, la memoria está disponible nuevamente. La pila es de tamaño finito. Si está almacenando variables muy masivas y hace muchas llamadas recursivas, puede quedarse sin espacio. ¿Derecha?

Así .....

Al parecer Zend tiene dos formas de asignar los datos: en el montón (un área más general para solicitar la memoria de) y en la pila, y la pila es un lugar más eficiente tenerlos por la forma en que se programan las cosas. (No sé por qué, pero puedo adivinar. Puede haber problemas de almacenamiento en caché de muy bajo nivel: supongo que es más probable que la pila esté en caché L1 o L2 que la memoria arbitraria en el montón, porque la CPU es es muy probable que utilice esa área con mucha frecuencia, cada vez que llame a una función, de hecho. También puede haber una sobrecarga de asignación para el acceso a datos de pila.)

"Intensivo" de datos en este contexto, creo, se refiere a datos que es muy probable que se use muy pronto o muy a menudo. Tendría sentido usar la asignación más rápida basada en la pila para estas variables. ¿Qué tipo de variables está seguro de usar muy rápido? Bueno, ¿qué hay de los parámetros de una función? Es muy probable que los uses: de lo contrario, ¿por qué te molestarías en pasarlos?También es probable que sean elementos de datos pequeños (referencias a estructuras de datos masivas en lugar de estructuras de datos masivas en sí mismas, porque eso le da una sobrecarga de copia, entre otras cosas). Entonces la pila probablemente tenga sentido para almacenar los parámetros de la función PHP para la mayoría de los programadores de PHP ... pero falla antes en la recursión.

Esperemos que responde, al menos, "¿qué significa esto?". Para su pregunta de rendimiento de recursión: hágalo usted mismo; probablemente depende de qué tipo de recursión estés tratando de hacer.

+0

@Eric: en cuanto a medir el rendimiento, XDebug ofrece perfiles de PHP (http://xdebug.org/docs/profiler). – outis

0

En una conjetura, diría que su problema es otro que el propio recursividad. Para muchas cosas, Java es mucho más rápido que PHP. Hay, más o menos, formas de mejorar el rendimiento de PHP.

Sin embargo, los resultados de limitación de PHP recursividad en PHP quedando sin pila y estrellarse, con el temido mensaje 'desbordamiento de pila' (juego de palabras especie de intención). En este punto, su programa deja de ejecutarse.

Si PHP está utilizando una pila dinámica, se podía ver una cierta desaceleración (leve), debido al tiempo que tarda en realloc la pila a un bloque más grande de memoria.

De todos modos, necesitaría saber un poco más sobre lo que está haciendo para determinar tu problema de rendimiento, que es algo que hago para vivir ...

Cuestiones relacionadas