PHP 递归效率分析


Posted in PHP onNovember 24, 2009

而且是差了3倍的效率。所以,PHP中的递归一定要小心的对待。
最近写了一个快速排序的算法,发现PHP中的递归效率不能一刀切,在各种不同的服务器中,可能会表现不一样。

function qsort(&$arr) 
{ 
_quick_sort($arr, 0, count($arr) - 1); 
} /** 
* 采用递归算法的快速排序。 
* 
* @param array $arr 要排序的数组 
* @param int $low 最低的排序子段 
* @param int $high 最高的排序字段 
*/ 
function _quick_sort(&$arr, $low, $high) 
{ 
$low_data = $arr[$low]; 
$prev_low = $low; 
$prev_high = $high; 
while ($low < $high) 
{ 
while ($arr[$high] >= $low_data && $low < $high) { 
$high--; 
} 
if ($low < $high) { 
$arr[$low] = $arr[$high]; 
$low++; 
} 
while ($arr[$low] <= $low_data && $low < $high) { 
$low++; 
} 
if ($low < $high) { 
$arr[$high] = $arr[$low]; 
$high--; 
} 
} 
$arr[$low] = $low_data; 
if ($prev_low < $low) { 
_quick_sort($arr, $prev_low, $low); 
} 
if ($low + 1 < $prev_high) { 
_quick_sort($arr, $low + 1, $prev_high); 
} 
} 
function quick_sort(&$arr) 
{ 
$stack = array(); 
array_push($stack, 0); 
array_push($stack, count($arr) -1); 
while (!empty($stack)) { 
$high = array_pop($stack); 
$low = array_pop($stack); 
$low_data = $arr[$low]; 
$prev_low = $low; 
$prev_high = $high; 
while ($low < $high) 
{ 
while ($arr[$high] >= $low_data && $low < $high) { 
$high--; 
} 
if ($low < $high) { 
$arr[$low] = $arr[$high]; 
$low++; 
} 
while ($arr[$low] <= $low_data && $low < $high) { 
$low++; 
} 
if ($low < $high) { 
$arr[$high] = $arr[$low]; 
$high--; 
} 
} 
$arr[$low] = $low_data; 
if ($prev_low < $low) { 
array_push($stack, $prev_low); 
array_push($stack, $low); 
} 
if ($low + 1 < $prev_high) { 
array_push($stack, $low + 1); 
array_push($stack, $prev_high); 
} 
} 
}

下面是测试速度的代码:
function qsort_test1() 
{ 
$arr = range(1, 1000); 
shuffle($arr); 
$arr2 = $arr; 
$t1 = microtime(true); 
quick_sort($arr2); 
$t2 = microtime(true) - $t1; 
echo "非递归调用的花费:" . $t2 . "\n"; 
$arr1 = $arr; 
$t1 = microtime(true); 
qsort($arr1); 
$t2 = microtime(true) - $t1; 
echo "递归调用的花费:" . $t2 . "\n"; 
}

在我的IIS 服务器上(CGI)模式,我的测试结果是:
非递归调用的花费:0.036401009559631
递归调用的花费:0.053439617156982
在我的Apache 服务器上,我的测试结果是:
非递归调用的花费:0.022789001464844
递归调用的花费:0.014809131622314
结果完全相反,而PHP的版本是一样的。
看来对递归的效率要具体问题具体分析了。
PHP 相关文章推荐
php设计模式 Template (模板模式)
Jun 26 PHP
php通过COM类调用组件的实现代码
Jan 11 PHP
怎样给PHP源代码加密?PHP二进制加密与解密的解决办法
Apr 22 PHP
ThinkPHP CURD方法之field方法详解
Jun 18 PHP
PHP使用range协议实现输出文件断点续传代码实例
Jul 04 PHP
php中unserialize返回false的解决方法
Sep 22 PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
Dec 07 PHP
php禁用cookie后session设置方法分析
Oct 19 PHP
深入理解PHP的远程多会话调试
Sep 21 PHP
PHP数组去重的更快实现方式分析
May 09 PHP
使用 PHP Masked Package 屏蔽敏感数据的实现方法
Oct 15 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
Apr 02 PHP
PHP 单引号与双引号的区别
Nov 24 #PHP
PHP小程序自动提交到自助友情连接
Nov 24 #PHP
php 引用(&amp;)详解
Nov 20 #PHP
php+javascript的日历控件
Nov 19 #PHP
php与XML、XSLT、Mysql的结合运用实现代码
Nov 19 #PHP
php 静态变量的初始化
Nov 15 #PHP
PHP 程序员的调试技术小结
Nov 15 #PHP
You might like
配置eAccelerator和XCache扩展来加速PHP程序的执行
2015/12/22 PHP
微信开发之获取JSAPI TICKET
2017/07/07 PHP
PHP迭代与递归实现无限级分类
2017/08/28 PHP
javascript 动态参数判空操作
2008/12/22 Javascript
javascript入门基础之私有变量
2010/02/23 Javascript
javascript 学习笔记(八)javascript对象
2011/04/12 Javascript
window.showModalDialog()返回值的学习心得总结
2014/01/07 Javascript
JS实现支持Ajax验证的表单插件
2016/03/24 Javascript
BootStrap的Datepicker控件使用心得分享
2016/05/25 Javascript
jQuery实现下拉框多选 jquery-multiselect 的实例代码
2016/07/14 Javascript
关于iframe跨域POST提交的方法示例
2017/01/15 Javascript
vue使用技巧及vue项目中遇到的问题
2018/06/04 Javascript
vue.js实现格式化时间并每秒更新显示功能示例
2018/07/07 Javascript
使用Object.defineProperty如何巧妙找到修改某个变量的准确代码位置
2018/11/02 Javascript
vue代码分割的实现(codesplit)
2018/11/13 Javascript
在vue项目中引入highcharts图表的方法
2019/01/21 Javascript
微信小程序实现人脸识别登陆的示例代码
2019/04/02 Javascript
[14:00]DOTA2国际邀请赛史上最长大战 赛后专访B神
2013/08/10 DOTA
[03:52]显微镜下的DOTA2第三期——英雄在无聊的时候干什么
2014/06/20 DOTA
[38:32]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第二局
2016/02/26 DOTA
Python中3种内建数据结构:列表、元组和字典
2014/11/30 Python
钉钉群自定义机器人消息Python封装的实例
2019/02/20 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
2020/03/06 Python
为什么说python适合写爬虫
2020/06/11 Python
python可以用哪些数据库
2020/06/22 Python
美国购买汽车零件网站:Buy Auto Parts
2018/04/02 全球购物
Pam & Gela官网:美国性感前卫女装品牌
2018/07/19 全球购物
DOUGLAS荷兰:购买香水和化妆品
2020/10/24 全球购物
儿科护士实习自我鉴定
2013/10/17 职场文书
元旦标语大全
2014/10/09 职场文书
项目转让协议书
2014/10/27 职场文书
单位租房协议书样本
2014/10/30 职场文书
2014年教务工作总结
2014/12/03 职场文书
员工年终考核评语
2014/12/31 职场文书
全国法制宣传日活动总结
2015/05/05 职场文书
高中同学会致辞
2015/08/01 职场文书