我对全局与功能参数进行了一些测试,但差别是徒劳的。
但是当我测试的东西时,我发现$ GLOBALS的速度慢了约10%。而不是使用函数参数或全局关键字。有人在乎解释原因吗?
我希望进一步了解PHP背后的机制。这样我就能在futur dev上做出更好的妥协。并非我曾使用$ GLOBALS,除非在某些例外情况下。
$md5 = md5(1000000);
function byGlobal() {
global $md5;
$c = 0;
while( md5($c) != $md5 ){
$c++;
}
}
function superGlobal() {
$c = 0;
while( md5($c) != $GLOBALS[ 'md5' ] ){
$c++;
}
}
function asParam($md5) {
$c = 0;
while( md5($c) != $md5 ){
$c++;
}
}
$time3 = microtime(true);
asParam($md5);
echo (microtime(true) - $time3);
echo "<br/>";
$time1 = microtime(true);
byGlobal();
echo (microtime(true) - $time1);
echo "<br/>";
$time2 = microtime(true);
superGlobal();
echo (microtime(true) - $time2);
echo "<br/>";
我不是在争论功能与全球或良好实践。我真的很想知道为什么这么大的区别。测试20次,结果几乎一致。
第一次运行
as param:0.8601s
全球:0.8262s
为$ GLOBALS:0.9463s(慢了10%以上)
第二轮
as param:0.8100s
全球:0.8058s
$ GLOBALS:0.9624s(再次慢10%以上)
相关研究:(关于全球最佳实践的主要争论,关于$ GLOBALS与全球业绩的关系。
The advantage / disadvantage between global variables and function parameters in PHP?
答案 0 :(得分:2)
我已经重写了你的测试,所以它会测试你想要的东西:
<?php
$value = 6235;
function byGlobal() {
global $value;
return $value++;
}
function superGlobal() {
return $GLOBALS['value']++;
}
function asParam($parameter) {
return $parameter++;
}
$time = microtime(true);
for ($i = 0;$i < 10000000;$i++) $value = asParam($value);
echo 'asParam: '.(microtime(true)-$time).'<br/>';
$time = microtime(true);
for ($i = 0;$i < 10000000;$i++) $value = byGlobal();
echo 'byGlobal: '.(microtime(true)-$time).'<br/>';
$time = microtime(true);
for ($i = 0;$i < 10000000;$i++) $value = superGlobal();
echo 'superGlobal: '.(microtime(true)-$time).'<br/>';
CentOs7上PHP 7.0.17的示例结果:
asParam: 0.43703699111938
byGlobal: 0.55213189125061
superGlobal: 0.70462608337402
和
asParam: 0.4569981098175
byGlobal: 0.55681920051575
superGlobal: 0.76146912574768
所以,superGlobal是最慢的,但不是那么多。我想原因是它是一个数组。
我从中得到的是PHP很快!我不担心这些微小时间片的细微差别。拥有可读代码更为重要。我的经验是网站中最慢的是数据库查询。