设为首页收藏本站

就爱编程论坛

 找回密码
 注册

人人连接登陆

无需注册,直接登录

用新浪微博连接

一步搞定

QQ登录

只需一步,快速开始

查看: 390|回复: 0
打印 上一主题 下一主题

foreach、while、for性能比较 [复制链接]

Rank: 9Rank: 9Rank: 9

  • TA的每日心情
    无聊
    2025-5-27 03:37:20
  • 签到天数: 366 天

    [LV.9]以坛为家II

    论坛先锋 学习至圣 荣誉成员 论坛元老 活跃之星 终极领袖

    我玩的应用:

    跳转到指定楼层
    楼主
    发表于 2011-6-24 17:41:20 |只看该作者 |倒序浏览
    一般情况下,遍历一个数组有三种方法,for、while、foreach。其中最简单方便的是foreach。那么它们在操作和性能上存在什么差别,通常使用那种方法比较好。
    下面先让我们来测试一下共同遍历一个有50000个下标的一维数组所耗的时间:

    测试平台:
    CPU:P-M 725
    内存:512M
    硬盘:40G 5400转
    OS:Windows XP SP2
    WEB:apache 2.0.54  php5.0.4
    测试代码:
    <?php
    /*
      * @ Author: Lilov
      * @ Homepage: www.codesky.com
      * @ E-mail: zhongjiechao@gmail.com
      *
      */
    $arr = array();
    for($i = 0; $i < 50000; $i++){
    $arr[] = $i*rand(1000,9999);
    }
    function GetRunTime()
    {
    list($usec,$sec)=explode(" ",microtime());
    return ((float)$usec+(float)$sec);
    }
    ######################################
    $time_start = GetRunTime();
    for($i = 0; $i < count($arr); $i++){
    $str .= $arr[$i];
    }
    $time_end = GetRunTime();
    $time_used = $time_end - $time_start;
    echo 'Used time of for:'.round($time_used, 7).'(s)<br><br>';
    unset($str, $time_start, $time_end, $time_used);
    ######################################
    $time_start = GetRunTime();
    while(list($key, $val) = each($arr)){
    $str .= $val;
    }
    $time_end = GetRunTime();
    $time_used = $time_end - $time_start;
    echo 'Used time of while:'.round($time_used, 7).'(s)<br><br>';
    unset($str, $key, $val, $time_start, $time_end, $time_used);
    ######################################
    $time_start = GetRunTime();
    foreach($arr as $key => $val){
    $str .= $val;
    }
    $time_end = GetRunTime();
    $time_used = $time_end - $time_start;
    echo 'Used time of foreach:'.round($time_used, 7).'(s)<br><br>';
    ######################################
    ?>
    测试结果:
    将三次测试结果求平均值:
    分别对应for、while、foreach
    0.1311650
    0.1666853
    0.1237440
    经过反复多次测试,结果表明,对于遍历同样一个数组,foreach速度最快,最慢的则是while。foreach比while大约快20% ~ 30%左右。随后再把数组下标增加到500000、5000000测试结果也一样。但从原理上来看,foreach是对数组副本进行操作(通过拷贝数组),而while则通过移动数组内部指标进行操作,一般逻辑下认为,while应该比foreach快(因为foreach在开始执行的时候首先把数组复制进去,而while直接移动内部指标。),但结果刚刚相反。原因应该是,foreach是PHP内部实现,而while是通用的循环结构。
    所以,在通常应用中我更喜欢用foreach形式,简单,而且效率高。在PHP5下,  foreach还可以遍历类的属性。
    分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    分享分享0 收藏收藏1 支持支持0 反对反对0 分享到人人 转发到微博
    [img=http://mail.qq.com/cgi-bin/qm_share?t=qm_mailme&email=fRUcHhYWGAQ9GxIFEBwUEVMeEhA]http://rescdn.qqmail.com/zh_CN/htmledition/images/function/qm_open/ico_mailme_02.png[/img]

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册 人人连接登陆

    晴云孤魂's Blog|就爱编程搜帖|手机版|Archiver|就爱编程论坛     

    GMT+8, 2025-7-2 01:17 , Processed in 0.091949 second(s), 27 queries .

    Powered by Discuz! X2

    © 2001-2011 Comsenz Inc.

    回顶部