[英]Track memory usage of a method
我還沒有找到一個優雅的解決方案。 我有一個帶有要跟蹤的內存使用情況而無需修改函數的方法的類:
class Example
{
public function hello($name)
{
$something = str_repeat($name, pow(1024, 2));
}
}
$class = new Example;
$class->hello('a');
因此,任務是, hello()
在不干涉的情況下使用了多少內存?
注意:此方法的內存使用量應為1MB。 我試過用memory_get_usage();
包裝該調用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
類使用了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中,因此總的內存使用量將人為增加。 避免此問題的一種方法是在進行數據處理(序列化)時將數據寫到文件中,完成后可以將其讀回。
由Facebook 專家開發的XHProfLive剖析器提供了這種程度的功能/方法級別的剖析,並且可以通過PECL下載獲得 。
從函數返回時,內存被釋放。
您可以添加$s = memory_get_usage(); ... echo memory_get_usage() - $s;
$s = memory_get_usage(); ... echo memory_get_usage() - $s;
阻止功能內部。 這樣,將不會釋放所使用的內存。
在hello()調用結束后,它似乎已經“釋放”了內存。
這樣做的結果是什么:
$s = memory_get_usage();
$class->hello('a');
echo memory_get_peak_usage() - $s;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.