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

__destruct y memoria usada por mi script

Estas en el tema de __destruct y memoria usada por mi script en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola a todos. Estoy intentando optimizar mi script y me encontre con que cuando intento destruir un objeto el pico de memoria y la memoria ...
  #1 (permalink)  
Antiguo 23/10/2008, 08:41
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 19 años, 4 meses
Puntos: 2
Exclamación __destruct y memoria usada por mi script

Hola a todos.

Estoy intentando optimizar mi script y me encontre con que cuando intento destruir un objeto el pico de memoria y la memoria total utilizada, en vez de bajar, suben!

Este es el caso:

Código PHP:
Class {
   
#...

   
public function __destruct() {
  }

}

Class 
extends 

  private 
Obj null;

  public function 
__construct() {
      
parent::construct();
      
$this->obj = new X();
  }

  public function 
__destruct() {
      
parent::__destruct();
      
$this->X->__destruct();
  }

Si ejecuto esto, TAL CUAL esta escrito, este es mi uso de memoria:

Peak: 798,240 bytes
Memory: 750,760 bytes


Si a la clase X le QUITO la funcion __destruct (que de hecho, está vacia!):

Peak: 797,648 bytes
Memory: 749,992 bytes


Osea que, si mi clase X NO TIENE destructor, uso menos memoria... y no puedo entender por qué razón. En mi sistema la clase aquí representada por "X" también tiene destructor vacio...

No comprendo bien por que sucede esto, y busque bastante por PHP.NET y nadie habla sobre casos similares

Gracias de antemano!
  #2 (permalink)  
Antiguo 23/10/2008, 09:17
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: __destruct y memoria usada por mi script

Como es que estas leyendo la memoria?, Si es directo del OS, pueden ser mil causas, recuerda que PHP tiene un uso de memoria especifico (p.e. 16 MB), y dentro de esos 16 MB PHP va a asignar y desasignar variables y es probable que la memoria la limpie hasta el final de ejecución y no al tu llamar a __destruct().

Ojo también, __destruct() es llamado hasta que asignas a null el objeto.

Saludos.
  #3 (permalink)  
Antiguo 23/10/2008, 09:57
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 19 años, 4 meses
Puntos: 2
Respuesta: __destruct y memoria usada por mi script

La estoy leyendo con:

Código PHP:
    echo 'Peak: ' number_format(memory_get_peak_usage(), 0'.'',') . " bytes<br>";
    echo 
'Memory: ' number_format(memory_get_usage(), 0'.'',') . " bytes<br>"
Si entiendo mas o menos como funciona el tema de recolección de basuro. Pero yo me baso en un principio basico, el que dice que si ya no voy a usar un objeto y quiero liberar la memoria utilizada por el mismo, lo destruyo ... pero no parece funcionar como yo creía al menos en este caso :S

Con las variables anda perfecto, pero ya con objetos y a veces con arrays me falla...

Se que igualmente al finalizar el script el server limpia todo, pero hay cosas que las quiero limpiar en tiempo de ejecución, en este caso deshacerme de instancias de objetos que ya no quiero utilizar.
  #4 (permalink)  
Antiguo 23/10/2008, 10:04
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: __destruct y memoria usada por mi script

Pero como te comento, tienes que asignar a nulo las variables para poder destruirlas, el "exceso" de memoria que puedes ver puede ser debido al insertar el __destruct() de las clases, es probable que ocupe más la clase en memoria.

Prueba llamar a las funciones después de asignar a null el objeto.

Saludos.
  #5 (permalink)  
Antiguo 23/10/2008, 12:13
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 19 años, 4 meses
Puntos: 2
Respuesta: __destruct y memoria usada por mi script

Si la verdad es que te entiendo y te doy la razón, pero esto me parece que no quiere respetar las leyesde la naturaleza JA... ahora mirá:

en mi constructor tengo:

Código PHP:

$sys 
= new Sys_Info();
...
...

# me voy sin limpiar nada... 

Resultado:

Peak: 791 976
Memory: 744 480


Código PHP:

$sys 
= new Sys_Info();
...
...

# me voy limpiando...
unset($sys);
$sys=null

Resultado:

Peak: 792 192
Memory: 744 696


¿Puede tener algo que ver el S.O.? Ahora estoy en el trabajo y acá usamos win xp, apache, mysql... otra explicación no le encuentro, a no ser que el sistema use más recursos para destruir un objeto que lo que este esté ocupando... pero sería estupido de solo pensarlo.

O tal vez es que necesito patear bien fuerte el cpu al grito de "¡que me devuelvas mis 12bytes maldito cerdo capitalista!!!!!!!!"

:O

gracias por la ayuda :)
  #6 (permalink)  
Antiguo 23/10/2008, 12:37
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: __destruct y memoria usada por mi script

Mmm supongo que podrías hacer otra prueba un poco más notable, trata de crear un arreglo de objetos o varios objetos y ve el uso de memoria, luego destruyelos y vuelve a crearlos y mide, luego haz un script sin destruirlos explicitamente y verifica el cambio.

Saludos.
  #7 (permalink)  
Antiguo 27/10/2008, 12:22
 
Fecha de Ingreso: noviembre-2002
Mensajes: 1.341
Antigüedad: 21 años, 5 meses
Puntos: 17
Respuesta: __destruct y memoria usada por mi script

Cita:
Iniciado por Computer XTress Ver Mensaje
¿Puede tener algo que ver el S.O.? Ahora estoy en el trabajo y acá usamos win xp, apache, mysql...
¿Estás haciendo las pruebas en máquinas diferentes? Si es así deberías hacerlo todo en la misma máquina, bajo el mismo escenario, sino no son muy fiables...

De estar haciendo así, no tengo ni idea de la razón, pero es algo despreciable... Habría que probar con clases grandes (que creo que es lo que te recomienda GatorV)
  #8 (permalink)  
Antiguo 28/10/2008, 11:49
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 19 años, 4 meses
Puntos: 2
Respuesta: __destruct y memoria usada por mi script

Hola,

Si, en esta misma maquina esta el cliente y el servidor... es un windows con xamp (apache+mysql). Si es muy raro la verdad... ahora voy a probar cunado llegue a casa con mi server con linux a ver si hace lo mismo.

Y tambien les cuento en un rato qué pasa con una prueba como la que me indicas GatorV

GRACIAS por la ayuda

ed
  #9 (permalink)  
Antiguo 29/10/2008, 04:59
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 11 meses
Puntos: 32
Respuesta: __destruct y memoria usada por mi script

Creo que hacer esta prueba no tiene sentido, no vas a detectar mejoras con clases simples y menos sin escala.

Si haces una prueba de estas, deberías hacer algún scripts de test de stress que agrege miles de clases y luego las destruya, con varios scripts haciendo lo mismo en paralelo.

Pero de todas formas me parece que la mejor forma no es destruir así el objeto, es que cargues lo que debes, no más.

Por ejemplo, usar el patrón Proxy, tener un objeto vacío que solo carga lo que necesita en el momento.

Si tienes un método getNombreParticipante() y esto tiene que ir a la tabla de participantes, hacer un select, todas las veces que lo pidas en tu sistema (bien podrías loguear todas las consultas y ver de reducirlas), solo traes la primera vez y la segunda (si el dato está cargado) lo retornas sin consultas a la base.

Etc, hay muchas cosas antes que puedes hacer que lo que estás intentando hacer.

Y en la mayoría de los casos la "optimización extrema" que sugieren los "gurues de cartón" ("usar ++$a ya que es más rápido que $a++", etc) son ridículas, sin sustento y en realidad no generan ningún impacto en el sistema.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
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 08:13.