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查询域名状态whois的类
Nov 25 PHP
php中配置文件操作 如config.php文件的读取修改等操作
Jul 07 PHP
php除数取整示例
Apr 24 PHP
php获取textarea的值并处理回车换行的方法
Oct 20 PHP
php调用shell的方法
Nov 05 PHP
PHP基于MySQL数据库实现对象持久层的方法
Jun 17 PHP
thinkPHP使用post方式查询时分页失效的解决方法
Dec 09 PHP
thinkPHP删除前弹出确认框的简单实现方法
May 16 PHP
php 使用html5实现多文件上传实例
Oct 24 PHP
php中文乱码问题的终极解决方案汇总
Aug 01 PHP
PHP实现的堆排序算法详解
Aug 17 PHP
PHP自定义递归函数实现数组转JSON功能【支持GBK编码】
Jul 17 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实现支付宝小程序用户授权的工具类
2018/12/25 PHP
使用tp框架和SQL语句查询数据表中的某字段包含某值
2019/10/18 PHP
javascript 多种搜索引擎集成的页面实现代码
2010/01/02 Javascript
jQuery 性能优化手册 推荐
2010/02/23 Javascript
jQuery旋转插件—rotate支持(ie/Firefox/SafariOpera/Chrome)
2013/01/16 Javascript
js带按钮的提示框可供选择示例代码
2013/09/17 Javascript
javascript实现点击提交按钮后显示loading的方法
2015/07/03 Javascript
jQuery插件简单实现方法
2015/07/18 Javascript
基于jquery实现图片相关操作(重绘、获取尺寸、调整大小、缩放)
2015/12/25 Javascript
jquery拖动层效果插件用法实例分析(附demo源码)
2016/04/28 Javascript
15个值得开发人员关注的jQuery开发技巧和心得总结【经典收藏】
2016/05/25 Javascript
Ionic如何创建APP项目
2016/06/03 Javascript
浅谈几种常用的JS类定义方法
2016/06/08 Javascript
angularJs关于指令的一些冷门属性详解
2016/10/24 Javascript
详解JavaScript的内置对象
2016/12/07 Javascript
Angular2使用Augury来调试Angular2程序
2017/05/21 Javascript
快速了解vue-cli 3.0 新特性
2018/02/28 Javascript
基于angular6.0实现的一个组件懒加载功能示例
2018/04/12 Javascript
Node.js npm命令运行node.js脚本的方法
2018/10/10 Javascript
浅谈webpack 四个核心概念之Entry
2019/06/12 Javascript
javascript自定义日期比较函数用法示例
2019/07/22 Javascript
ES6的异步操作之promise用法和async函数的具体使用
2019/12/06 Javascript
Python3指定路径寻找符合匹配模式文件
2015/05/22 Python
Django中login_required装饰器的深入介绍
2017/11/24 Python
python实现石头剪刀布程序
2021/01/20 Python
windows上安装python3教程以及环境变量配置详解
2019/07/18 Python
Python pandas用法最全整理
2019/08/04 Python
python 中不同包 类 方法 之间的调用详解
2020/03/09 Python
使用python创建Excel工作簿及工作表过程图解
2020/05/27 Python
Pycharm 2020.1 版配置优化的详细教程
2020/08/07 Python
Too Faced官网:美国知名彩妆品牌
2017/03/07 全球购物
Under Armour安德玛法国官网:美国高端运动科技品牌
2018/06/29 全球购物
经贸韩语专业大学生职业规划
2014/02/14 职场文书
说明书怎么写
2014/05/06 职场文书
一些让Python代码简洁的实用技巧总结
2021/08/23 Python
动画电影《龙珠超 超级英雄》延期上映
2022/03/20 日漫