php - 跟踪方法的内存使用情况

标签 php function memory methods

我还没有找到一个优雅的解决方案。我有一个类,我想在不修改函数的情况下跟踪其内存使用情况:

class Example
{
    public function hello($name)
    {
        $something = str_repeat($name, pow(1024, 2));
    }
}

$class = new Example;
$class->hello('a');

那么任务是,hello()在不干扰的情况下使用了多少内存?

注意:此方法的内存使用量应为1MB。我试过用 memory_get_usage(); 包装调用无济于事:

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;

这只会产生 144 个字节(根本不正确)。我通过使用 ReflectionMethod 类尝试了反射的各种魔法。

我觉得我需要做的是计算方法中的差异:(。如果有人能想到任何更清洁的东西,那么你真的会让我开心。

编辑:我应该提到这是在基准测试应用程序的上下文中。因此,虽然 memory_get_peak_usage 在正确返回内存使用情况的意义上有效,但它也会扭曲在高内存方法之后运行的基准。现在,如果有办法重置内存统计信息,那也很好。

最佳答案

您可以使用 register_tick_function只需将 memeory_get_usage 转储出每个刻度(行)并稍后分析。下面的类可以通过使用 debug_backtrace 来查找与内存使用相关的行号或使用 microtime 添加每行时间来改进。

分析器类

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

示例

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

输出

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

可能的问题

由于此分析器类将数据存储在 PHP 中,因此整体内存使用量会人为增加。回避此问题的一种方法是在执行过程中将数据写入文件(序列化),完成后您可以将其读回。

关于php - 跟踪方法的内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4286193/

相关文章:

c - 如何加载与 jq 一起使用的数学库?

c - 算术和递归函数调用的堆栈内存使用

php - 连接到 paypal 不起作用

php - 显示来自 mysql 查询的部分结果

javascript - 将多个处理程序绑定(bind)到元素

memory - 如何在无限滚动中从 Puppeteer 中释放内存?

c++ - 从函数创建和返回一个大对象

php - 如何确定一个单词是英语还是任何其他语言

php - 如何在 laravel 中使用 sql NOW( ) 函数

c - 如何实现标准C函数提取?