Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Lentitud de un script

Estas en el tema de Lentitud de un script en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas tardes a todos, tengo una duda existencial. A ver si se me explicar. Tengo un objeto php con varios procedimientos. Este objeto sirve para ...
  #1 (permalink)  
Antiguo 23/07/2009, 07:57
 
Fecha de Ingreso: diciembre-2008
Mensajes: 129
Antigüedad: 16 años
Puntos: 1
Lentitud de un script

Buenas tardes a todos, tengo una duda existencial. A ver si se me explicar.

Tengo un objeto php con varios procedimientos. Este objeto sirve para traducir un código de texto a un código numérico. Y es una traducción muy complicada, con muchas instrucciones. El objeto tiene unas 9000 líneas. Como el script que lo ejecuta es muy lento, estoy intentando optimizar la traducción, para ganar en velocidad. Pero contra más optimizo la traducción, el objeto se va haciendo más y más grande, y la ejecución del script me va más lenta.

O sea que mientras más optimizado esta el algoritmo, más lento va el script. Es eso debido a que el objeto se hace cada vez más grande y el sistema necesita más memoria para tener en caché el objeto en cuestión? Porque me va más lento si el algoritmo realiza la traducción con menos instrucciones? Que soluciones hay ?

Muchas gracias a todos.
  #2 (permalink)  
Antiguo 23/07/2009, 09:40
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 7 meses
Puntos: 2135
Respuesta: Lentitud de un script

En teoría no importa la cantidad de lineas, una vez que el objeto se compila se guarda en bytecode y no importa el tamaño.

Lo que me llama la atención de lo que dices es que mientras mas optimizas el algoritmo, crece mas el objeto, creo una optimización es al revez, entre más fino es el algoritmo tiende a hacerse más pequeño el proceso, así que revisa que no estes al contrario haciendo las cosas más lentas al agregar instrucciones.

Recuerda que programar es como una receta, entre más pasos más se tarda, entre menos pasos el resultado se obtiene más rápido.
  #3 (permalink)  
Antiguo 23/07/2009, 09:56
 
Fecha de Ingreso: diciembre-2008
Mensajes: 129
Antigüedad: 16 años
Puntos: 1
Respuesta: Lentitud de un script

Gracias GatorV.

Mierda !!! Porque ahora si que ya no entiendo nada. Estoy de acuerdo contigo, contra mejor es el algoritmo, más simple es todo y la cosa se reduce. Es verdad. Pero no en este caso. Te pongo un ejemplo de codigo optimizado con más lineas, pero el problema está en que no sé cual el el problema. Porque va más lento !

Ejemplo 1:

Si Raikonnen return (1);
Si Alonso return (2);
Si Massa return (3);
Si Button return (4);
Si Nadal return (5);
Si Federer return (6);
Si Murray return (7);
Si Robredo return (8);

Ejemplo con omptimizacion (+ líneas, - instrucciones ejecutadas)

Si F1 {
Si Raikonnen return (1);
Si Alonso return (2);
Si Massa return (3);
Si Button return (4);
}

Si Tenis {
Si Nadal return (5);
Si Federer return (6);
Si Murray return (7);
Si Robredo return (8);
}
  #4 (permalink)  
Antiguo 23/07/2009, 18:02
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 7 meses
Puntos: 2135
Respuesta: Lentitud de un script

Pues desconozco realmente, y lamentablemente no hay una "solución mágica" debes de optimizar el algoritmo a lo máximo verifica los consumos de memoria, variables perdidas etc.
  #5 (permalink)  
Antiguo 24/07/2009, 13:44
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 20 años, 5 meses
Puntos: 102
Respuesta: Lentitud de un script

Arreglo = ['persona' => 'número']

return Arreglo[persona] // regresa número

¿no? ... , que tantos if me marean .

Solo pasaba por aquí ...
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #6 (permalink)  
Antiguo 24/07/2009, 18:39
 
Fecha de Ingreso: julio-2009
Mensajes: 30
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Lentitud de un script

Y, añado, si no me equivoco, a menos que uses else, siempre se comprobaran todos los IF que estén al mismo nivel, en tu caso:

Si F1 {
Si Raikonnen return (1);
else Si Alonso return (2);
else Si Massa return (3);
else Si Button return (4);
}

else Si Tenis {
Si Nadal return (5);
else Si Federer return (6);
else Si Murray return (7);
else Si Robredo return (8);
}

Espero no equivocarme, saludiñes.
  #7 (permalink)  
Antiguo 25/07/2009, 07:01
 
Fecha de Ingreso: diciembre-2008
Mensajes: 129
Antigüedad: 16 años
Puntos: 1
Respuesta: Lentitud de un script

Cita:
Iniciado por jam1138 Ver Mensaje
Arreglo = ['persona' => 'número']

return Arreglo[persona] // regresa número
Genial !!!! Genial !!!! Brutal !!!! Fácil y rápido !!!!

Solo una preguntilla, lo tendría de hacer de la siguiente forma:

if array_key_exists ( "Nadal" , array_deportistas) return (array_deportistas["Nadal"]);

Imaginemos un array de 1000 deportistas. En este caso, la función array_key_exists tiene que buscar para todas las claves, las 1000 diferentes claves.

- No es lo mismo que hacer 1000 if ? (para el php, me refiero).
- No es lo mismo en tiempo ? O hasta mas lento, porque depués al retornar una clave específica también el php tiene que ir a buscar esa clave en el array.

Dicho de otra forma: Que ejecuta más rápido, la Opción 1 o la opción 2 ? :

Opción 1

Si Raikonnen return (1);
Si Alonso return (2);
Si Massa return (3);
Si Button return (4);
Si Nadal return (5);
Si Federer return (6);
Si Murray return (7);
Si Robredo return (8);

Opción 2

array_deportistas = array ("Raikonnen" => 1,
"Alonso" => 2,
"Massa" => 3,
"Button" => 4,
"Nadal" => 5,
"Federer" => 6,
"Murray" => 7,
"Robredo" => 8);

if array_key_exists ( "Nadal" , array_deportistas) return (array_deportistas["Nadal"]);

Última edición por initio; 25/07/2009 a las 07:16
  #8 (permalink)  
Antiguo 25/07/2009, 12:05
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 7 meses
Puntos: 2135
Respuesta: Lentitud de un script

Pruebalo haz un script de prueba y haz un recorrido usando microtime() para que veas cuanto tiempo se tarda en ejecutar.

Saludos.
  #9 (permalink)  
Antiguo 29/07/2009, 06:51
 
Fecha de Ingreso: diciembre-2008
Mensajes: 129
Antigüedad: 16 años
Puntos: 1
Respuesta: Lentitud de un script

Cita:
Iniciado por GatorV Ver Mensaje
Pruebalo haz un script de prueba y haz un recorrido usando microtime() para que veas cuanto tiempo se tarda en ejecutar.

Saludos.
A quien le interese : probado. Es 10 veces más rápida la opción 1 que la 2. Lo siento jam1138, la idea es buena, pero lenta. Los ifs siguen ganando.
  #10 (permalink)  
Antiguo 29/07/2009, 12:00
Avatar de gjx2  
Fecha de Ingreso: agosto-2008
Ubicación: R.D
Mensajes: 1.153
Antigüedad: 16 años, 4 meses
Puntos: 139
Respuesta: Lentitud de un script

Los if consumen muchos recursos del sistema , es algo logico
Si existe 300 if
El sistema preguntara 300 veces :-s lo cual es una locura

Pero algo mas rapido que el if podria ser el
switch()

Opción 1

Código PHP:
switch(  $deportista ){
case 
"Raikonnen":
return 
1;
break;

case 
"Alonso":
return 
2;
break;

......


Con el switch el interprete no va preguntando linea por linea
Va directo al punto.
  #11 (permalink)  
Antiguo 29/07/2009, 18:47
 
Fecha de Ingreso: diciembre-2008
Mensajes: 129
Antigüedad: 16 años
Puntos: 1
Respuesta: Lentitud de un script

Cita:
Iniciado por gjx2 Ver Mensaje
Con el switch el interprete no va preguntando linea por linea
Va directo al punto.
Falso. Es exactamente lo mismo 300 ifs que un switch con 300 case. Se los patea todos hasta que encuentra el bueno.

Saludos
  #12 (permalink)  
Antiguo 29/07/2009, 20:17
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 20 años, 5 meses
Puntos: 102
Respuesta: Lentitud de un script

Cita:
Iniciado por initio Ver Mensaje
A quien le interese : probado. Es 10 veces más rápida la opción 1 que la 2. Lo siento jam1138, la idea es buena, pero lenta. Los ifs siguen ganando.
Lo siento por tí ... pero, en serio, ¿taaanto? ... ¿podrías mostrar cómo lo hiciste?.

No sé qué tanta información manejes, pero tanta comparación 1-1 no debe ser buena. ¿haz contemplado el uso de alguna BD?



PD: Cierto, usar if-else o switch es lo mismo ... ¡pero!, hay una gran diferencia muy valiosa: la legibilidad de código.
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #13 (permalink)  
Antiguo 30/07/2009, 02:01
 
Fecha de Ingreso: diciembre-2008
Mensajes: 129
Antigüedad: 16 años
Puntos: 1
Respuesta: Lentitud de un script

Cita:
Iniciado por jam1138 Ver Mensaje
Lo siento por tí ... pero, en serio, ¿taaanto? ... ¿podrías mostrar cómo lo hiciste?.
Si lo digo aquí, es porque lo he probado. Es sencillo, como dijo GatorV, con la función microtime(). Tienes una función con esa mega comparación (una con if's, y otra con array) y la llamas 5 veces (o las que te la gana). Puedes comprobarlo tu mismo. Si es un array va 10 veces mas lento (algo mas de 10 veces, pero he redondeado), tal y como indica microtime() después de cada una de las llamadas.

Cita:
Iniciado por jam1138 Ver Mensaje
No sé qué tanta información manejes, pero tanta comparación 1-1 no debe ser buena. ¿haz contemplado el uso de alguna BD?
No soluciona el problema. Ahora no voy a explicar toda la aplicación.

Gracias a todos por vuestra ayuda.
  #14 (permalink)  
Antiguo 30/07/2009, 13:12
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 20 años, 5 meses
Puntos: 102
Respuesta: Lentitud de un script

Cita:
Iniciado por initio Ver Mensaje
Si lo digo aquí, es porque lo he probado.
Ya, ya, ya ... como quieras. Solo me sorprende que la diferencia sea tanta, pero, así como tú no tienes tiempo de explicar tu aplicación y de mostrar algo que ya hiciste, tampoco lo tengo yo para comprobar algo que no me incumbe.

La intención siempre es ver lo que se hace y partir de ahí para sugerir otras alternativas (como el no emplear la función array_key_exists() como, ahora veo, sugeriste), pero qué se le va a hacer.

Suerte
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:36.