2015-01-06 171 views
1

每隔一段時間我都會看到關於SO的問題,其答案/解決方案包括使用get_defined_vars()或使用該方法的互聯網上的博客文章。在大多數情況下,它用於調試目的,但在某些情況下,似乎作者有意在生產代碼中使用它。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

@PaulCrovella - 我有一個方法,並有,這就是爲什麼我按下「回答你自己的問題」按鈕。我專門提出了這個問題,所以我可以回答。也就是說,我也會對其他人的發現或更正感興趣。 – Mike

+0

這是公平的,我有一個衡量代碼塊性能的相當標準的方法,但是在我自己去測試這些測試之前,我會經常看Google,看看它是否值得。第一。也就是說,還有一些關於這個問題的SO問題/答案,所以它有助於得到一個關於它的性能的堅實的SO答案。 – Mike

回答

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 

總結論

使用進行調試,我不會甚至沒有習慣在夜晚將代碼留在代碼中。謹慎使用。

相關問題