TLDR:Pass by parameter
= $GLOBALS element
>>>global $var
有疑问时,测试!下面的结果表明:
- 通过参数传递1MB的字符串是远远大于全球$ VAR
- 通过参数传递1MB的字符串裁判更好的性能是大致相等的高性能为使用$ GLOBALS [“变种”]
- 以下面的方式使用全局$ 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";
我不认为这会令多大的差别,以及代码的可读性是很重要的。即使传递变量稍微慢一点(我不知道是否是这样),通常应该避免使用全局变量。 – halfer