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中使用preg_match_all匹配文章中的图片
Feb 06 PHP
解析mysql 表中的碎片产生原因以及清理
Jun 22 PHP
解析file_get_contents模仿浏览器头(user_agent)获取数据
Jun 27 PHP
thinkphp 一个页面使用2次分页的实现方法
Jul 15 PHP
php通过strpos查找字符串出现位置的方法
Mar 17 PHP
大家都应该掌握的PHP关联数组使用技巧
Dec 25 PHP
yii分页组件用法实例分析
Dec 28 PHP
PHP实现的构造sql语句类实例
Feb 03 PHP
THINKPHP在添加数据的时候获取主键id的值方法
Apr 03 PHP
thinkPHP框架动态配置用法实例分析
Jun 14 PHP
thinkphp5引入公共部分header、footer的方法详解
Sep 14 PHP
关于laravel框架中的常用目录路径函数
Oct 23 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
PHP中for循环语句的几种变型
2006/11/26 PHP
php页面,mysql数据库转utf-8乱码,utf-8编码问题总结
2015/08/27 PHP
php版微信公众平台接口开发之智能回复开发教程
2016/09/22 PHP
php获取数据库中数据的实现方法
2017/06/01 PHP
PHP开发的文字水印,缩略图,图片水印实现类与用法示例
2019/04/12 PHP
用js实现的抽象CSS圆角效果!!
2007/05/03 Javascript
js 判断一个元素是否在页面中存在
2012/12/27 Javascript
javaScript让文本框内的最后一个文字的后面获得焦点实现代码
2013/01/06 Javascript
用jquery中插件dialog实现弹框效果实例代码
2013/11/15 Javascript
jquery组件使用中遇到的问题整理及解决
2014/02/21 Javascript
js 去除字符串第一位逗号的方法
2014/06/07 Javascript
JavaScript中获取高度和宽度函数总结
2014/10/08 Javascript
jQuery大于号(&gt;)选择器的作用解释
2015/01/13 Javascript
Javascript中With语句用法实例
2015/05/14 Javascript
如何解决谷歌浏览器下jquery无法获取图片的尺寸
2015/09/10 Javascript
BootStrap和jQuery相结合实现可编辑表格
2016/04/21 Javascript
利用Mongoose让JSON数据直接插入或更新到MongoDB
2017/05/03 Javascript
Python使用xlrd读取Excel格式文件的方法
2015/03/10 Python
python在ubuntu中的几种安装方法(小结)
2017/12/08 Python
python多任务之协程的使用详解
2019/08/26 Python
500行代码使用python写个微信小游戏飞机大战游戏
2019/10/16 Python
python构造函数init实例方法解析
2020/01/19 Python
Python生成六万个随机,唯一的8位数字和数字组成的随机字符串实例
2020/03/03 Python
Django 返回json数据的实现示例
2020/03/05 Python
html5实现九宫格抽奖可固定抽中某项奖品
2020/06/15 HTML / CSS
俄罗斯运动、健康和美容产品在线商店:Lactomin.ru
2020/07/23 全球购物
桥梁与隧道工程专业本科生求职信
2013/10/08 职场文书
给幼儿园老师的表扬信
2014/01/19 职场文书
二年级数学教学反思
2014/01/21 职场文书
绘画专业自荐信
2014/07/04 职场文书
中职三好学生事迹材料
2014/08/24 职场文书
无故旷工检讨书
2015/08/15 职场文书
2016廉洁教育心得体会
2016/01/20 职场文书
redis实现共同好友的思路详解
2021/05/26 Redis
Mysql数据库group by原理详解
2022/07/07 MySQL
Java获取字符串编码格式实现思路
2022/09/23 Java/Android