Track memory usage of a method

后端 未结 6 2081
[愿得一人]
[愿得一人] 2021-02-20 11:58

I have yet to find an elegant solution for this. I have a class with a method I want to track the memory usage of without modifying the function:

class Example
{         


        
6条回答
  •  情书的邮戳
    2021-02-20 12:37

    You could use register_tick_function and just dump memeory_get_usage out every tick (line) and analysis it later. The class below could be improved by using debug_backtrace to find line number related to memory usage or adding time per line using microtime.

    Profiler class

    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;
        }
    }
    

    Example

    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 );
    

    Output

    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
            )
    )
    

    Possible Issue

    Since this profiler class stores the data in PHP, the overall memory usage will increase artificially. One way to sidestep this issue would be to write the data out to a file as you go (serialized), and when your done you can read it back.

提交回复
热议问题