zoukankan      html  css  js  c++  java
  • 转载 foreach比递归效率低

    转载原文于phpchina

    刚在phpcms函数文件看到一个将数组转换为序列化的url函数,使用了三层foreach实现,我就很奇怪,为什么不用递归,群里面问了问,有几位朋友说是递归效率差,所以就做了这个测试
    测试结果大出意料:
    用嵌套foreach 执行需要时间为7秒多
    用递归执行时间4秒多
    废话不多说,先说下环境
    winxp,1.5g内存,双核1.6
    测试数组:三层含有100万健的数组
    下面提供源码

     1 <?php
     2 $begin_time = microtime_float();
     3 /**
     4 *
     5 * 将数组转换为&a=1&b=1 url形式
     6 * @param array $data
     7 * @param string $urlencode url编码函数,为空则不进行url编码
     8 * @return string
     9 */
    10 //自己写的递归函数
    11 function array2url($data,$urlencode="rawurlencode"){
    12 !empty($urlencode)&&!function_exists($urlencode)&&$urlencode='';
    13 $str='';
    14 if(isset($data)&&is_array($data)){
    15 foreach($data as $k=>$v){
    16 if(isset($v)&&is_array($v)){
    17 $str.=array2url($v,$urlencode);
    18 }else{
    19 if(!empty($urlencode)){
    20 $str.="&".$urlencode($k)."=".$urlencode($v);
    21 }else{
    22 $str.="&".($k)."=".($v);
    23 }
    24 }
    25 }
    26 }
    27 return $str;
    28 }
    29 
    30 //phpcms原函数
    31 function arrayforeach($data){
    32 $s='';
    33 $sep = '&';
    34 foreach($data as $k => $v) {
    35 if(is_array($v)) {
    36 $s2 = $sep2 = '';
    37 foreach($v as $k2 => $v2) {
    38 if(is_array($v2)) {
    39 $s3 = $sep3 = '';
    40 foreach($v2 as $k3=>$v3) {
    41 $k3 = $k3;
    42 $s3 .= "$sep3{$k}[$k2][$k3]=".rawurlencode($v3);
    43 $sep3 = '&';
    44 }
    45 $s .= $sep2.$s3;
    46 } else {
    47 $s2 .= "$sep2{$k}[$k2]=".rawurlencode($v2);
    48 $sep2 = '&';
    49 $s .= $sep.$s2;
    50 }
    51 }
    52 } else {
    53 $s .= "$sep$k=".rawurlencode($v);
    54 }
    55 }
    56 return $s;
    57 }
    58 
    59 function microtime_float(){
    60 list($usec, $sec) = explode(" ", microtime());
    61 return ((float)$usec + (float)$sec);
    62 }
    63 
    64 //创建一个三层键值总共100w的数组
    65 function create_array(){
    66 $data=array();
    67 for($i=0;$i<100;$i++){
    68 for($j=0;$j<100;$j++){
    69 for($k=0;$k<100;$k++){
    70 $data[$i][$j][$k]=rand(10000, 100000000);
    71 }
    72 }
    73 }
    74 return $data;
    75 }
    76 
    77 $a=create_array();
    78 
    79 
    80 //测试1,自己的函数,执行时间4秒多点
    81 //array2url($a,null);
    82 //echo $second=microtime_float()-$begin_time;
    83 
    84 //phpcms内置嵌套foreach,执行时间7秒多
    85 arrayforeach($a);
    86 echo microtime_float()-$begin_time;
  • 相关阅读:
    on() 和 click() 的区别
    net core swagger
    sgen.exe 未能运行
    SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)
    net core 实现简单爬虫—抓取博客园的博文列表
    javascript基础 方法
    android通过httpClient请求获取JSON数据并且解析
    发布到IIS的时候用户 'WWW-6743CC520E9ASPNET' 登录失败
    WebServices生成发布过程及常见问题的解决方法
    Android、iPhone和Java三个平台一致的加密工具
  • 原文地址:https://www.cnblogs.com/koker/p/5660116.html
Copyright © 2011-2022 走看看