问题
可以说我有这个功能:
function hog($i = 1) // uses $i * 0.5 MiB, returns $i * 0.25 MiB
{
$s = str_repeat('a', $i * 1024 * 512); return substr($s, $i * 1024 * 256);
}
我想调用它并能够检查它使用的最大内存量。
换句话说:memory_get_function_peak_usage($callback);
. 这可能吗?
我试过的
我使用以下值作为我的非单调递增$i
参数hog()
:
$iterations = array_merge(range(0, 50, 10), range(50, 0, 5));
$iterations = array_fill_keys($iterations, 0);
本质上是:
(
[0] => 0
[10] => 0
[20] => 0
[30] => 0
[40] => 0
[50] => 0
[45] => 0
[35] => 0
[25] => 0
[15] => 0
[5] => 0
)
附上memory_get_usage()
foreach ($iterations as $key => $value)
{
$alpha = memory_get_usage(); hog($key);
$iterations[$key] = memory_get_usage() - $alpha;
}
print_r($iterations);
输出:
(
[0] => 96
[10] => 0
[20] => 0
[30] => 0
[40] => 0
[50] => 0
[45] => 0
[35] => 0
[25] => 0
[15] => 0
[5] => 0
)
如果我存储 的返回值hog()
,结果开始看起来更真实:
foreach ($iterations as $key => $value)
{
$alpha = memory_get_usage(); $s = hog($key);
$iterations[$key] = memory_get_usage() - $alpha; unset($s);
}
print_r($iterations);
输出:
(
[0] => 176
[10] => 2621536
[20] => 5242976
[30] => 7864416
[40] => 10485856
[50] => 13107296
[45] => 11796576
[35] => 9175136
[25] => 6553696
[15] => 3932256
[5] => 1310816
)
正如预期的那样,现在它向我显示了返回的内存量,但我需要使用的总内存。
使用register_tick_function()
:
我不知道,但事实证明,当你这样做时:
declare (ticks=1)
{
$a = hog(1);
}
它不会为函数内的每一行、语句或代码块打勾hog()
,只针对declare
块内的代码 - 所以,除非函数在其中定义,否则这个选项是不行的。
与gc_*
功能混合:
我尝试使用 , 的组合(我必须说希望不大)gc_disable()
,gc_enable()
并gc_collect_cycles()
通过上面的两个实验来查看是否有任何改变 - 它没有。