【问题标题】:Peak memory usage of code block? [duplicate]代码块的内存使用峰值? [复制]
【发布时间】:2012-12-30 21:26:40
【问题描述】:

是否可以在 PHP 中获得特定代码块的峰值内存使用量? memory_get_peak_usage() 函数似乎在整个过程执行中达到了峰值,直到函数调用为止,但这不是我想要获得的,因为其他代码块可能会扭曲该值。我试图隔离代码块本身,而不是整个过程。

例子:

// Block 1
for ($i = 0; $i < $iterations; ++$i) {
    // some code
}

// Block 2
for ($i = 0; $i < $iterations; ++$i) {
    // some different code
}

// Determine which of the two blocks used the most memory during their execution here

很遗憾,xdebug 目前不适合我。

【问题讨论】:

    标签: php memory benchmarking


    【解决方案1】:

    编辑:XHProf 做到了,检查my answer here


    不要使用memory_get_peak_usage()

    $alpha = memory_get_usage();
    
    for ($i = 0; $i < $iterations; ++$i) {
        // some code
    }
    
    $used_memory = memory_get_usage() - $alpha;
    

    请记住,这只会返回您的// some code 所需的最终内存量。中间内存消耗(例如设置/销毁东西或调用函数)不会计算在内。

    您可以使用register_tick_function() 破解您的方式,但它仍然不适用于函数调用。

    【讨论】:

    • 感谢您的回答,但我在标题和问题中指定了我在代码块的 peak 内存使用之后。
    • @drrcknlsn:我也在追求同样的事情 (stackoverflow.com/q/16511611/89771),但我不认为这有什么好处。无论如何,就像我在回答中所说的那样,如果您不关心块中的外部函数调用,您仍然可以使用 register_tick_function() 获得峰值内存使用量。
    • @drrcknlsn:用链接更新了它。
    【解决方案2】:

    我不知道执行此操作的特定函数,但如果您只是尝试隔离代码块,则可以执行以下简单操作:

    $before = memory_get_peak_usage();
    for ($i = 0; $i < $iterations; ++$i) {
        // some code
    }
    $after = memory_get_peak_usage();
    $used_memory = $after - $before;
    

    【讨论】:

    • 我在我的问题中解释了为什么这不起作用。
    • 只使用一次就可以让你在整个代码中达到最高点。但是,在前后有一个变量并减去会给你该函数的峰值内存使用量。
    • 由于我在问题中概述的原因,这不会像您认为的那样工作。因为memory_get_peak_usage() 维护一个正在运行的maximum,如果您包装的代码块使用的less 小于该最大值,后续调用仍将显示该最大值,而您的@987654323 @ 将是 0。
    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2023-04-03
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    相关资源
    最近更新 更多