2014-02-25 70 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";