首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么$GLOBALS比全局关键字慢得多?

为什么$GLOBALS比全局关键字慢得多?
EN

Stack Overflow用户
提问于 2017-03-30 22:35:26
回答 1查看 402关注 0票数 1

我对全局参数和函数参数做了一些测试,结果都是徒劳的。

但是当我测试的时候,我发现$GLOBALS大约慢了10%。而不是使用函数参数或全局关键字。有人想解释原因吗?

我希望进一步了解PHP背后的机制。这样我就可以在futur dev上做出更好的妥协。除了一些例外情况外,我从未使用过$GLOBALS。

代码语言:javascript
复制
$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上运行PHP5.4.16的VM。

第一轮

as param :0.8601 全球排名:0.8262秒与$GLOBALS :0.9463秒(慢速10%以上)

第二轮

as param :0.8100 全球: 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?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-30 23:04:23

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

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

代码语言:javascript
复制
<?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/>';

PHP7.0.17在CentOs7上的示例结果:

代码语言:javascript
复制
asParam: 0.43703699111938
byGlobal: 0.55213189125061
superGlobal: 0.70462608337402

代码语言:javascript
复制
asParam: 0.4569981098175
byGlobal: 0.55681920051575
superGlobal: 0.76146912574768

因此,superGlobal是最慢的,但没有那么慢。我想原因是因为它是一个数组。

我从中得到的是PHP是快速的!我不会担心这些微小的时间切片之间的细微差别。拥有可读的代码要重要得多。我的经验是,在一个网站中,最慢的是数据库查询。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43129481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档