问题
可以说我有这个功能:
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()通过上面的两个实验来查看是否有任何改变 - 它没有。