回顾一下上篇。在PHP编程中,对比数组的值是一个很常见的需求,这个时候将其值与键反转的确比通常的值对值的比较效率要高得多。第三个函数仅仅判断这个数组是否存在该键就可以了(反转数组也就循环一次,还可以把重复元素剔除),加上数组键和值不同的组织索引方式,效率比原生的还高那就非常可以理解了。

与查找一样,遍历也是数组很常见的操作之一。那么遍历是否也会因为PHP的数组是哈希表而有不同的效率呢?那么我们先来像上一篇一样,做个性能试验吧。

比较性能

下面是array_walk 和 foreach, for 效率比较的小程序。

/**
 * array_walk 和 foreach, for 的效率的比较。
 * 我们要测试的是foreach, for, 和 array_walk的效率的问题。 
 */

//产生一个10000的一个数组。
$max = 10000;
$test_arr = range(0, $max);
$temp = \'\';
//我们分别用三种方法测试求这些数加上1的值的时间。

// for 的方法
$t1 = microtime(true);
for ($i = 0; $i < $max; $i++) {
    $temp = $temp + 1;
}
$t2 = microtime(true);
$t = $t2 - $t1;
echo "就使用for, 没有对数组操作 花费: {$t}".\'<br />\';

$t1 = microtime(true);
for ($i = 0; $i < $max; $i++) {
    $test_arr[$i] = $test_arr[$i] + 1;
}
$t2 = microtime(true);
$t = $t2 - $t1;
echo "使用for 并且直接对数组进行了操作 花费: {$t}".\'<br />\';

$t1 = microtime(true);
for ($i = 0; $i < $max; $i++) {
    addOne($test_arr[$i]);
}
$t2 = microtime(true);
$t = $t2 - $t1;
echo "使用for 调用函数对数组操作 花费 : {$t}".\'<br />\';

$t1 = microtime(true);
foreach ($test_arr as $k => &$v) {
    $temp = $temp + 1;
}
$t2 = microtime(true);
$t = $t2 - $t1;
echo "使用 foreach 没有对数组操作 花费 : {$t}".\'<br />\';

$t1 = microtime(true);
foreach ($test_arr as $k => &$v) {
    $v = $v + 1;
}
$t2 = microtime(true);
$t = $t2 - $t1;
echo "使用 foreach 直接对数组操作 : {$t}".\'<br />\';

$t1 = microtime(true);
foreach ($test_arr as $k => &$v) {
    addOne($v);
}
$t2 = microtime(true);
$t = $t2 - $t1;
echo "使用 foreach 调用函数对数组操作 : {$t}".\'<br />\';

$t1 = microtime(true);
array_walk($test_arr, \'addOne\');
$t2 = microtime(true);
$t = $t2 - $t1;
echo "使用 array_walk 花费 : {$t}".\'<br />\';

function addOne(&$item) {
    $item = $item + 1;
}

程序运行结果为(为方便比较,更改一下顺序):

使用 for, 没有对数组操作 花费: 0.0030920505523682
使用 foreach 没有对数组操作 花费 : 0.0021021366119385

使用 for 并且直接对数组进行了操作 花费: 0.0043869018554688
使用 foreach 直接对数组操作 花费: 0.0026419162750244

使用for 调用函数对数组操作 花费 : 0.28954601287842
使用 foreach 调用函数对数组操作 : 0.27538895606995
使用 array_walk 花费 : 0.30511689186096

在对10000个数的操作过程中,这个实验我们可以得出这样的结论:foreach 的效率要比for 高很多,也许有很大的一个原因是for 要进行很多次条件判断。所以以后能用foreach的地方就用foreach,可以提高大约1倍的效率。

在试验中,array_walk() 调用函数比其余两者要慢一点点。但这个不是我们现在关心的内容,现在我们需要关注的是 for 和 foreach 性能的比较。除去上面说到的, for 需要多次条件判断之外, foreach 还有什么地方让它的效率如此之高?后面会慢慢剖析开来

转载:http://www.nowamagic.net/academy/detail/1204408

版权声明:本文为anyongchao原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/anyongchao/p/3903496.html