为什么 $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次,结果几乎一致。
- 我在代码中上下移动调用以避免缓存影响。
- 我在每次调用时都进行了百万次 md5 迭代,因此服务器可以正常工作
负载。
- 时间结果与其他哈希函数(测试的 sha1、crc32)一致,并且它们都慢了 10%)
- 运行 在虚拟机上 PHP 5.4.16 在 CentOs7 上。
第一运行
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 很快!我不会担心这些微小时间片中的微小差异。拥有可读的代码要重要得多。我的经验是网站中最慢的事情是数据库查询。
我已经对全局参数和函数参数进行了一些测试,但差异是徒劳的。
但是当我测试东西时,我发现 $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次,结果几乎一致。
- 我在代码中上下移动调用以避免缓存影响。
- 我在每次调用时都进行了百万次 md5 迭代,因此服务器可以正常工作 负载。
- 时间结果与其他哈希函数(测试的 sha1、crc32)一致,并且它们都慢了 10%)
- 运行 在虚拟机上 PHP 5.4.16 在 CentOs7 上。
第一运行
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 很快!我不会担心这些微小时间片中的微小差异。拥有可读的代码要重要得多。我的经验是网站中最慢的事情是数据库查询。