转载 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;

 

posted @ 2016-07-11 14:23  北宋小康  阅读(771)  评论(0编辑  收藏  举报