for和foreach,究竟哪个快? - anyongchao
回顾一下上篇。在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