2014-02-25 116 views
0

如果我有使用全局變量或傳遞變量的選項,哪種選項在速度和內存使用方面更好?PHP中的全局變量或傳遞變量? (性能)

// global variable 
function func(){ 
    global $var; 
    echo $var; 
} 

$var='string'; 
func(); 


// passing variable 
function func($var){ 
    echo $var; 
} 

$var='string'; 
func($var); 
+1

我不認爲這會令多大的差別,以及代碼的可讀性是很重要的。即使傳遞變量稍微慢一點(我不知道是否是這樣),通常應該避免使用全局變量。 – halfer

回答

1

全局變量可能會更快,但不會以某種方式檢測到,除非您將其微調爲基準。因此,根據哪些代碼更具可讀性/可維護性(幾乎在所有情況下都會傳遞該變量)做出決定,而不是您通常不會注意到的速度優勢。

1

我不認爲你會看到任何性能差異。但是你應該意識到,僅僅爲了這樣做而使用全局變量並不是一個好主意。最終,這將是一個問題,閱讀代碼,開發和測試。

1

在PHP中,global $var本質上是在幕後運行$var = &$_GLOBALS['var'],所以你會看看搜索時間O(n)。使用傳入的變量運行函數的成本很小,因此不值得優化。

一般來說,您應該在功能正確,易於讀取/測試和快速哪些方面找到平衡點。在這種情況下,速度差異可以忽略不計,而整體可讀性和可測試性的成本相當嚴重。

0

TLDR:Pass by parameter = $GLOBALS element >>>global $var

有疑問時,測試!下面的結果表明:

  1. 通過參數傳遞1MB的字符串是遠遠大於全球$ VAR
  2. 通過參數傳遞1MB的字符串裁判更好的性能是大致相等的高性能爲使用$ GLOBALS [「變種」]
  3. 以下面的方式使用全局$ var似乎與內存中的GC引用計數混亂,而且速度很慢。顯然,不要使用全局$ var來處理這樣的情況。

結果(見下文進一步代碼):
時間是秒過去時,存儲器存儲潛在泄漏。

$ php -e test.php 
Pass value by parameter 
Time: 0.20166087150574s 
Memory: 0 

Global var reference 
Time: 70.613216876984s 
Memory: 1048576 

GLOBALS array reference 
Time: 0.22573900222778s 
Memory: 0 

測試代碼:

<?php 

$baseVar = str_repeat('x', 1000000); 
$GLOBALS['myVar'] = $baseVar; 

function testfunc_param($paramVar) { 
    $localVar = $paramVar; 
    return $localVar; 
} 

function testfunc_global() { 
    global $myVar; 
    $localVar = $myVar; 
    return $localVar; 
} 

function testfunc_globalsarray() { 
    $localVar = $GLOBALS['myVar']; 
    return $localVar; 
} 


// Testing passing value by parameter 
memory_get_usage(); // in case this procs garbage collection 
$memoryStart = memory_get_usage(true); 
$timeStart = microtime(true); 
for ($i = 0; $i < 1000000; $i++) { 
    testfunc_param($baseVar); 
} 
$timeEnd = microtime(true); 
$memoryEnd = memory_get_usage(true); 
print "Pass value by parameter\nTime: ".($timeEnd - $timeStart)."s\nMemory: ".($memoryEnd-$memoryStart)."\n\n"; 


// Testing reference to global variable 
memory_get_usage(); // in case this procs garbage collection 
$memoryStart = memory_get_usage(true); 
$timeStart = microtime(true); 
for ($i = 0; $i < 1000000; $i++) { 
    testfunc_global(); 
} 
$timeEnd = microtime(true); 
$memoryEnd = memory_get_usage(true); 
print "Global var reference\nTime: ".($timeEnd - $timeStart)."s\nMemory: ".($memoryEnd-$memoryStart)."\n\n"; 


// Testing reference to global variable via $GLOBALS 
memory_get_usage(); // in case this procs garbage collection 
$memoryStart = memory_get_usage(true); 
$timeStart = microtime(true); 
for ($i = 0; $i < 1000000; $i++) { 
    testfunc_globalsarray(); 
} 
$timeEnd = microtime(true); 
$memoryEnd = memory_get_usage(true); 
print "GLOBALS array reference\nTime: ".($timeEnd - $timeStart)."s\nMemory: ".($memoryEnd-$memoryStart)."\n\n";