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

Why is $GLOBALS significately slower than global keywords?

我已经对全局参数和函数参数进行了一些测试,但差异是徒劳的。

但是当我测试东西时,我发现 $GLOBALS 慢了大约 10%。而不是使用函数参数或全局关键字。有人愿意解释为什么吗?

我想进一步了解PHP背后的机制。这样我就可以在未来的开发上做出更好的妥协。并不是说我曾经使用过 $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

as global : 0.8262s

as $GLOBALS : 0.9463s (more than 10% slower)

第 2 运行

as param : 0.8100s

as global : 0.8058s

as $GLOBALS : 0.9624s (more than 10% slower again)

相关研究:(主要是关于全球最佳实践的争论,与 $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?

编辑:新版本,我在第一个中犯了一个错误。

我已经重写了你的测试,所以它确实测试了你想要的东西:

<?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 很快!我不会担心这些微小时间片中的微小差异。拥有可读的代码要重要得多。我的经验是网站中最慢的事情是数据库查询。