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