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 文件夹删除、php清除缓存程序
Aug 25 PHP
PHP5中新增stdClass 内部保留类
Jun 13 PHP
配置php网页显示各种语法错误
Sep 23 PHP
php实现的Timer页面运行时间监测类
Sep 24 PHP
Laravel 5框架学习之环境与配置
Apr 08 PHP
php异常处理方法实例汇总
Jun 24 PHP
Linux操作系统安装LAMP环境
Jun 26 PHP
PHP实现无限级分类(不使用递归)
Oct 22 PHP
php去除二维数组的重复项方法
Nov 03 PHP
PHP+MySQL存储数据常见中文乱码问题小结
Jun 13 PHP
php生成图片缩略图功能示例
Feb 22 PHP
laravel 使用事件系统统计浏览量的实现
Oct 16 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
桌面中心(四)数据显示
2006/10/09 PHP
The specified CGI application misbehaved by not returning a complete set of HTTP headers
2011/03/31 PHP
PHP表单提交表单名称含有点号(.)则会被转化为下划线(_)
2011/12/14 PHP
php分割合并两个字符串的函数实例
2015/06/19 PHP
深入浅析Yii admin的权限控制
2016/08/31 PHP
PHP载入图像imagecreatefrom_gif_jpeg_png系列函数用法分析
2016/11/14 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
Span元素的width属性无效果原因及解决方案
2010/01/15 Javascript
Javascript的数组与字典用法与遍历对象的属性技巧
2012/11/07 Javascript
JavaScript 函数replace深入了解
2013/03/14 Javascript
javascript三元运算符用法实例
2015/04/16 Javascript
JavaScript实现下拉列表框数据增加、删除、上下排序的方法
2015/08/11 Javascript
node.js使用cluster实现多进程
2016/03/17 Javascript
javascript制作照片墙及制作过程中出现的问题
2016/04/04 Javascript
js仿百度切换皮肤功能(html+css)
2016/07/10 Javascript
jQuery插件HighCharts绘制2D圆环图效果示例【附demo源码下载】
2017/03/09 Javascript
Angular项目从新建、打包到nginx部署全过程记录
2017/12/09 Javascript
nodeJS服务器的创建和重新启动的实现方法
2018/05/12 NodeJs
基于AngularJs select绑定数字类型的问题
2018/10/08 Javascript
mpvue开发音频类小程序踩坑和建议详解
2019/03/12 Javascript
vue elementUI table 自定义表头和行合并的实例代码
2019/05/22 Javascript
Python多线程编程(六):可重入锁RLock
2015/04/05 Python
Django的分页器实例(paginator)
2017/12/01 Python
Python计算一个给定时间点前一个月和后一个月第一天的方法
2018/05/29 Python
用Python爬取QQ音乐评论并制成词云图的实例
2019/08/24 Python
python打印文件的前几行或最后几行教程
2020/02/13 Python
Ubuntu18.04安装 PyCharm并使用 Anaconda 管理的Python环境
2020/04/08 Python
Selenium常见异常解析及解决方案示范
2020/04/10 Python
python statsmodel的使用
2020/12/21 Python
意大利独特而优质的家居用品:Fazzini
2018/12/05 全球购物
矿泉水广告词
2014/03/20 职场文书
党委书记个人对照检查材料
2014/09/15 职场文书
护士2014年终工作总结
2014/11/11 职场文书
2015年党员公开承诺事项
2015/04/27 职场文书
舞出我人生观后感
2015/06/16 职场文书
python代码实现备忘录案例讲解
2021/07/26 Python