转载 foreach比递归效率低
2016-07-11 14:23
197 查看
转载原文于phpchina
刚在phpcms函数文件看到一个将数组转换为序列化的url函数,使用了三层foreach实现,我就很奇怪,为什么不用递归,群里面问了问,有几位朋友说是递归效率差,所以就做了这个测试
测试结果大出意料:
用嵌套foreach 执行需要时间为7秒多
用递归执行时间4秒多
废话不多说,先说下环境
winxp,1.5g内存,双核1.6
测试数组:三层含有100万健的数组
下面提供源码
刚在phpcms函数文件看到一个将数组转换为序列化的url函数,使用了三层foreach实现,我就很奇怪,为什么不用递归,群里面问了问,有几位朋友说是递归效率差,所以就做了这个测试
测试结果大出意料:
用嵌套foreach 执行需要时间为7秒多
用递归执行时间4秒多
废话不多说,先说下环境
winxp,1.5g内存,双核1.6
测试数组:三层含有100万健的数组
下面提供源码
<?php $begin_time = microtime_float(); /** * * 将数组转换为&a=1&b=1 url形式 * @param array $data * @param string $urlencode url编码函数,为空则不进行url编码 * @return string */ //自己写的递归函数 function array2url($data,$urlencode="rawurlencode"){ !empty($urlencode)&&!function_exists($urlencode)&&$urlencode=''; $str=''; if(isset($data)&&is_array($data)){ foreach($data as $k=>$v){ if(isset($v)&&is_array($v)){ $str.=array2url($v,$urlencode); }else{ if(!empty($urlencode)){ $str.="&".$urlencode($k)."=".$urlencode($v); }else{ $str.="&".($k)."=".($v); } } } } return $str; } //phpcms原函数 function arrayforeach($data){ $s=''; $sep = '&'; foreach($data as $k => $v) { if(is_array($v)) { $s2 = $sep2 = ''; foreach($v as $k2 => $v2) { if(is_array($v2)) { $s3 = $sep3 = ''; foreach($v2 as $k3=>$v3) { $k3 = $k3; $s3 .= "$sep3{$k}[$k2][$k3]=".rawurlencode($v3); $sep3 = '&'; } $s .= $sep2.$s3; } else { $s2 .= "$sep2{$k}[$k2]=".rawurlencode($v2); $sep2 = '&'; $s .= $sep.$s2; } } } else { $s .= "$sep$k=".rawurlencode($v); } } return $s; } function microtime_float(){ list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } //创建一个三层键值总共100w的数组 function create_array(){ $data=array(); for($i=0;$i<100;$i++){ for($j=0;$j<100;$j++){ for($k=0;$k<100;$k++){ $data[$i][$j][$k]=rand(10000, 100000000); } } } return $data; } $a=create_array(); //测试1,自己的函数,执行时间4秒多点 //array2url($a,null); //echo $second=microtime_float()-$begin_time; //phpcms内置嵌套foreach,执行时间7秒多 arrayforeach($a); echo microtime_float()-$begin_time;
相关文章推荐
- CentOS 6.3 中安装VirtualBOX增强工具失败:Building the main Guest Additions module[FAILED]
- 主题模型
- mac 安装brew
- MYSQL附近的人设计思路
- Java并发编程:并发容器之ConcurrentHashMap(转载)
- Putty打不开
- ZBrush中保存历史记录太多该如何解决
- 关于语义化标签
- Codeforces Round #361 (Div. 2) 套题
- leetcode.177. Nth Highest Salary
- 如何根据基类指针来判断这个基类是由那个子类转换而来!
- HTML5
- web,视频播放两种方法
- Java ConcurrentModificationException异常原因和解决方法
- UVA - 699 The Falling Leaves 二叉树
- oninput,onpropertychange,onchange的用法
- 字符串-401 - Palindromes
- Hibernate+JPA注解
- PHP 获取中国时间,即上海时区时间
- Javascript数组操作详细解答