Seguir el uso de la memoria de un método

Todavía tengo que encontrar una solución elegante para esto. Tengo una clase con un método que quiero rastrear el uso de memoria sin modificar la función:

class Example { public function hello($name) { $something = str_repeat($name, pow(1024, 2)); } } $class = new Example; $class->hello('a'); 

Entonces, la tarea es, ¿cuánta memoria usa hello() sin interferir con ella?

Nota: El uso de memoria de este método debe ser de 1 MB. Intenté memory_get_usage(); la llamada con memory_get_usage(); en vano:

 class Example { public function hello($name) { $something = str_repeat($name, pow(1024, 2)); } } $class = new Example; $s = memory_get_usage(); $class->hello('a'); echo memory_get_usage() - $s; 

Esto solo da como resultado 144 bytes (no es correcto en absoluto). He intentado varias magias con Reflection usando la clase ReflectionMethod .

Tengo la sensación de que lo que tengo que hacer es calcular la diferencia en el método :(. Si alguien puede pensar en algo más limpio, entonces realmente me alegrarás el día.

Editar: Debo mencionar que esto se encuentra en el contexto de una aplicación de evaluación comparativa. Así que mientras memory_get_peak_usage funciona en el sentido de que devuelve correctamente el uso de la memoria, también sesgará los puntos de referencia ejecutados después de un método de memoria alta. Ahora bien, si había una manera de restablecer las estadísticas de memoria, eso también podría ser bueno.

Puede usar register_tick_function y simplemente descargar memeory_get_usage cada tick (línea) y analizarlo más tarde. La clase a continuación podría mejorarse utilizando debug_backtrace para encontrar el número de línea relacionado con el uso de la memoria o agregando tiempo por línea usando microtime .

Clase de Profiler

 class Profiler { private $_data_array = array(); function __construct() { register_tick_function( array( $this, "tick" ) ); declare(ticks = 1); } function __destruct() { unregister_tick_function( array( $this, "tick" ) ); } function tick() { $this->_data_array[] = array( "memory" => memory_get_usage(), "time" => microtime( TRUE ), //if you need a backtrace you can uncomment this next line //"backtrace" => debug_backtrace( FALSE ), ); } function getDataArray() { return $this->_data_array; } } 

Ejemplo

 class Example { public function hello($name) { $something = str_repeat($name, pow(1024, 2)); } } $profiler = new Profiler(); //starts logging when created $class = new Example; $class->hello('a'); $data_array = $profiler->getDataArray(); unset( $profiler ); //stops logging when __destruct is called print_r( $data_array ); 

Salida

 Array ( [0] => Array ( [memory] => 638088 [time] => 1290788749.72 ) [1] => Array ( [memory] => 638896 [time] => 1290788749.72 ) [2] => Array ( [memory] => 639536 [time] => 1290788749.72 ) [3] => Array ( [memory] => 640480 [time] => 1290788749.72 ) [4] => Array ( [memory] => 1689800 // <~ money! [time] => 1290788749.72 ) [5] => Array ( [memory] => 641664 [time] => 1290788749.72 ) ) 

Posible problema

Como esta clase de generador de perfiles almacena los datos en PHP, el uso general de la memoria boostá artificialmente. Una forma de eludir este problema sería escribir los datos en un archivo a medida que avanza (serializado), y cuando haya terminado puede leerlo nuevamente.

El perfilador XHProfLive desarrollado por los chicos de Facebook ofrece este grado de perfil de función / método y está disponible como descarga PECL .

La memoria se libera cuando regresas de la función.

Puede agregar $s = memory_get_usage(); ... echo memory_get_usage() - $s; $s = memory_get_usage(); ... echo memory_get_usage() - $s; bloque dentro de la función. De esta forma, la memoria utilizada no se liberará.

Parece que ya ha “liberado” la memoria después de que finalizó la llamada a hello ().

¿Cuáles son los resultados cuando lo haces?

 $s = memory_get_usage(); $class->hello('a'); echo memory_get_peak_usage() - $s; 

Deberías usar una herramienta de memoria php.

Hay uno agradable en este hilo SO: herramientas para analizar visualmente el uso de memoria de una aplicación PHP

esta otra pregunta tiene algunas respuestas adicionales con respecto a su pregunta

El único método confiable que conozco para lograr esto es perfilar con herramientas que no están escritas en php.

Lee esto:

http://www.xdebug.org/docs/profiler