• for和foreach,究竟哪个快?

    遍历的性能比较
    服务器君一共花费 273.038 ms 进行了 3 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

    回顾一下上篇。在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 还有什么地方让它的效率如此之高?后面会慢慢剖析开来。

更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [Python程序设计] urls.py设置技巧 8 个条目
  2. [Python程序设计] Tornado背景知识介绍 4 个条目
  3. [Python程序设计] Django 入门知识浅介 10 个条目
  4. [Python程序设计] Python Web部署的背景知识 9 个条目
  5. [PHP程序设计] PHP数组的遍历 7 个条目
  6. [移动开发] ListView 使用相关问题集 1 个条目
  7. [PHP程序设计] PHP扩展模块安装 1 个条目
  8. [PHP程序设计] Nginx基本操作释疑 7 个条目
  9. [移动开发] Android加载器Loaders 5 个条目
  10. [C语言程序设计] C语言里的全局变量 2 个条目
  11. [数据库技术] MySQL中英文混合排序 4 个条目
  12. [PHP程序设计] PHP数组探索 4 个条目
窗口 -- [资讯]