为什么$ GLOBALS明显慢于全局关键字?

时间:2017-03-30 22:35:27

标签: php performance global

我对全局与功能参数进行了一些测试,但差别是徒劳的。

但是当我测试的东西时,我发现$ 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次,结果几乎一致。

  • 我在代码中上下移动调用以避免缓存影响。
  • 我在每次调用时都进行了一百万次md5迭代,所以服务器工作了 负荷。
  • 时间结果与其他散列函数(测试sha1,crc32)一致,并且它们都在相同的+ 10%慢)
  • 在CentOs7上运行PHP 5.4.16的虚拟机。

第一次运行

  

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?

php global variable overhead in a framework

Does using global create any overhead?

1 个答案:

答案 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很快!我不担心这些微小时间片的细微差别。拥有可读代码更为重要。我的经验是网站中最慢的是数据库查询。