每隔一段时间我就会看到SO上的问题,其答案/解决方案包括get_defined_vars()
的使用,或互联网上使用该方法的博客文章。在大多数情况下,它用于调试目的,但在某些情况下,似乎作者有意在生产代码中使用它。
虽然我很少使用该功能,因为它让我感到内心不适,但我想知道在PHP应用程序中使用此功能的实际性能影响是什么。
其中一个example用法可能是查看变量是否明确设置为NULL
:
//$implicit_null = 1234;
$explicit_null = NULL;
var_dump(is_null($implicit_null)); // TRUE, also throws undefined index error
var_dump((
array_key_exists('implicit_null',get_defined_vars()) &&
is_null($implicit_null)
)); // FALSE
互联网上还有其他用例,但很少概述性能或内存的影响。
答案 0 :(得分:2)
事实证明,内存影响可能会有所不同,但在最坏的情况下,它几乎可以double your memory usage。
function report_memory($string = '') {
$mem = (memory_get_usage()/1000);
echo "$string: {$mem}kb\n";
return $mem;
}
// ~117.164kb
$start = report_memory('Start of stript');
for($i = 10000; $i > 0; $i--) {
$var = "filler_$i";
$$var = 'banana';
}
// ~1022.752kb after fill
$fill_size = ($after_fill = report_memory('After banana')) - $start;
// ~905.588kb fill size
echo "Fill Size: {$fill_size}kb\n\n";
$tmp_vars = get_defined_vars();
// ~1649.12kb after function call
$grew = report_memory('After get_defined_vars()') - $after_fill;
// ~626.368kb growth due to call
echo "Growth from get_defined_vars(): {$grew}kb\n\n";
同样,这是最糟糕的情况。当我使用array_fill()
填充数组时,我确实看到了some odd behavior。正如您在此处所看到的,与创建变量本身相比,调用get_defined_vars()
的增长非常小。我想,起初这是因为array
被返回作为引用,但这是clearly not the case。但是,还应该注意,对象将是returned as references,因为对象总是如此。
所有这一切都表明,所有的全局变量都不可能是数组上的数组上的数组,所有这些字符串,二进制数据和数字都会相当快地加起来。
最后,这是一个功能,几乎可以使内存占用量增加一倍,并产生significant wall-time:
for($i = 10000; $i > 0; $i--) {
$var = "filler_$i";
$$var = 'banana';
}
$start = microtime(true);
for($i = 250; $i > 0; $i--) {
$all = get_defined_vars();
}
$stop = microtime(TRUE);
echo round(((($stop - $start))/250)*1000000, 2); // ~1967.45 microseconds
一般性结论
仅使用 进行调试,我甚至不会养成将代码留在代码中的习惯。谨慎使用。