loop sizeof($x) vs loop ($x) 的真实speed/benchmark?
The real speed/benchmark of loop sizeof($x) vs loop ($x)?
我对循环中 sizeof($x) 与 $x 的速度感到困惑。该站点:phpbench.com 声称没有预计算 -count() 的 sizeof($x) 循环比使用预计算 count() 慢 千%。所以我做了如下测试,但我不确定这是否是正确的测试方法。结果表明,每个函数的时间几乎相同。所以我不明白它怎么会和phpbench网站有那么大的不同。
总而言之,如果函数 a(具有 sizeof($unset))确实比函数 b(具有预先计算的 $unset 值)慢得多,我想知道一个明确的答案。我认为现在 values/functions 存储在内存中,所以 sizeof($x) 实际上可能比几年前的服务器更快?
<?php
$v=0;
function a()
{
//sizeof
$unset=array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o');
for($i=0;$i<sizeof($unset);$i++) {$v=$v+1;}
return;
}
function b()
{
//pre calculated
$unset=array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o');
for($i=0;$i<15;$i++) {$v=$v+1;}
return;
}
function benchmark($func)
{
$start = microtime(true);
for ($i = 0; $i < 500000; $i++) {
$func();
}
$end = microtime(true);
$time = $end - $start;
echo $func . " time: " . sprintf('%.4f', $time) . PHP_EOL.'<br>';
}
benchmark('a'); // sizeof
benchmark('b'); // count
?>
根据我的基准测试 sizeof()
和 count()
执行大致相同,但是要从循环本身中挤出更多性能,您可以执行以下操作:
for($i=0, $c=sizeof($unset);$i<$c;$i++){
$v=$v+1;
}
这应该会提升它的性能,因为它不必在每个循环周期中都使用函数求值。
我使用的系统是here,代码如下:
$b = new \Benchmark(10000);
$b->register('sizeof', function(){
$unset=array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o');
for($i=0;$i<sizeof($unset);$i++) {$v=$v+1;}
});
$b->register('count', function(){
$unset=array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o');
for($i=0;$i<count($unset);$i++) {$v=$v+1;}
});
$b->register('count 2', function(){
$unset=array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o');
for($i=0, $c=count($unset);$i<$c;$i++) {$v=$v+1;}
});
$b->register('preset', function(){
$unset=array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o');
for($i=0;$i<15;$i++) {$v=$v+1;}
});
print_r($b->start());
结果如下:
Array
(
[stats] => Array
(
[phpversion] => 7.1.1
[itterations] => 40000
[duration] => 0.1180682182
[fastest] => preset
[slowest] => sizeof
)
[results] => Array
(
[0] => Array
(
[name] => preset
[time] => 0.0265829563
[average] => 0.0000026583
[speed] => 19.73%
)
[1] => Array
(
[name] => count 2
[time] => 0.0271441936
[average] => 0.0000027144
[speed] => 18.04%
)
[2] => Array
(
[name] => count
[time] => 0.0312242508
[average] => 0.0000031224
[speed] => 5.71%
)
[3] => Array
(
[name] => sizeof
[time] => 0.0331168175
[average] => 0.0000033117
[speed] => 0.00%
)
)
)
我对循环中 sizeof($x) 与 $x 的速度感到困惑。该站点:phpbench.com 声称没有预计算 -count() 的 sizeof($x) 循环比使用预计算 count() 慢 千%。所以我做了如下测试,但我不确定这是否是正确的测试方法。结果表明,每个函数的时间几乎相同。所以我不明白它怎么会和phpbench网站有那么大的不同。
总而言之,如果函数 a(具有 sizeof($unset))确实比函数 b(具有预先计算的 $unset 值)慢得多,我想知道一个明确的答案。我认为现在 values/functions 存储在内存中,所以 sizeof($x) 实际上可能比几年前的服务器更快?
<?php
$v=0;
function a()
{
//sizeof
$unset=array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o');
for($i=0;$i<sizeof($unset);$i++) {$v=$v+1;}
return;
}
function b()
{
//pre calculated
$unset=array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o');
for($i=0;$i<15;$i++) {$v=$v+1;}
return;
}
function benchmark($func)
{
$start = microtime(true);
for ($i = 0; $i < 500000; $i++) {
$func();
}
$end = microtime(true);
$time = $end - $start;
echo $func . " time: " . sprintf('%.4f', $time) . PHP_EOL.'<br>';
}
benchmark('a'); // sizeof
benchmark('b'); // count
?>
根据我的基准测试 sizeof()
和 count()
执行大致相同,但是要从循环本身中挤出更多性能,您可以执行以下操作:
for($i=0, $c=sizeof($unset);$i<$c;$i++){
$v=$v+1;
}
这应该会提升它的性能,因为它不必在每个循环周期中都使用函数求值。
我使用的系统是here,代码如下:
$b = new \Benchmark(10000);
$b->register('sizeof', function(){
$unset=array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o');
for($i=0;$i<sizeof($unset);$i++) {$v=$v+1;}
});
$b->register('count', function(){
$unset=array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o');
for($i=0;$i<count($unset);$i++) {$v=$v+1;}
});
$b->register('count 2', function(){
$unset=array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o');
for($i=0, $c=count($unset);$i<$c;$i++) {$v=$v+1;}
});
$b->register('preset', function(){
$unset=array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o');
for($i=0;$i<15;$i++) {$v=$v+1;}
});
print_r($b->start());
结果如下:
Array
(
[stats] => Array
(
[phpversion] => 7.1.1
[itterations] => 40000
[duration] => 0.1180682182
[fastest] => preset
[slowest] => sizeof
)
[results] => Array
(
[0] => Array
(
[name] => preset
[time] => 0.0265829563
[average] => 0.0000026583
[speed] => 19.73%
)
[1] => Array
(
[name] => count 2
[time] => 0.0271441936
[average] => 0.0000027144
[speed] => 18.04%
)
[2] => Array
(
[name] => count
[time] => 0.0312242508
[average] => 0.0000031224
[speed] => 5.71%
)
[3] => Array
(
[name] => sizeof
[time] => 0.0331168175
[average] => 0.0000033117
[speed] => 0.00%
)
)
)