簡體   English   中英

跟蹤方法的內存使用情況

[英]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;

您應該使用php記憶工具。

在該SO線程中可以找到一個不錯的工具用於可視化分析PHP應用程序的內存使用情況的工具

這另一個問題對您的問題還有其他一些答案

我知道實現此目標的唯一可信賴的方法是使用非PHP本身編寫的工具進行性能分析。

讀這個:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM