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 基本语法格式
Dec 15 PHP
php打开文件fopen函数的使用说明
Jul 05 PHP
php 伪静态之IIS篇
Jun 02 PHP
PHP中round()函数对浮点数进行四舍五入的方法
Nov 19 PHP
PHP 正则表达式小结
Feb 12 PHP
PHP数组与对象之间使用递归实现转换的方法
Jun 24 PHP
Yii框架组件和事件行为管理详解
May 20 PHP
jquery+thinkphp实现跨域抓取数据的方法
Oct 15 PHP
php指定长度分割字符串str_split函数用法示例
Jan 30 PHP
Laravel模型间关系设置分表的方法示例
Apr 21 PHP
PHP Redis扩展无法加载的问题解决方法
Aug 22 PHP
Laravel5.3+框架定义API路径取消CSRF保护方法详解
Apr 06 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
破解.net程序(dll文件)编译和反编译方法
2013/01/31 PHP
php+js实现异步图片上传实例分享
2014/06/02 PHP
Yii中render和renderPartial的区别
2014/09/03 PHP
PHP使用ODBC连接数据库的方法
2015/07/18 PHP
WIFI万能钥匙密码查询接口实例
2015/09/28 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
2016/02/15 PHP
php实现常见图片格式的水印和缩略图制作(面向对象)
2016/06/15 PHP
使用CSS3实现字体颜色渐变的实现
2021/03/09 HTML / CSS
页面中js执行顺序
2009/11/09 Javascript
jquery插件之信息弹出框showInfoDialog(成功/错误/警告/通知/背景遮罩)
2013/01/09 Javascript
JavaScrip调试技巧之断点调试
2015/10/22 Javascript
全面解析Bootstrap表单使用方法(表单样式)
2015/11/24 Javascript
jQuery中的insertBefore(),insertAfter(),after(),before()区别介绍
2016/09/01 Javascript
Bootstrap 模态框(Modal)插件代码解析
2016/12/21 Javascript
AngularJS页面带参跳转及参数解析操作示例
2017/06/28 Javascript
zTree jQuery 树插件的使用(实例讲解)
2017/09/25 jQuery
教你如何编写Vue.js的单元测试的方法
2018/10/17 Javascript
浅析vue-router原理
2018/10/19 Javascript
React降级配置及Ant Design配置详解
2018/12/27 Javascript
仿iPhone通讯录制作小程序自定义选择组件的实现
2019/05/23 Javascript
koa2+vue实现登陆及登录状态判断
2019/08/15 Javascript
小议Python中自定义函数的可变参数的使用及注意点
2016/06/21 Python
Flask框架各种常见装饰器示例
2018/07/17 Python
解决Tensorflow sess.run导致的内存溢出问题
2020/02/05 Python
Python爬虫requests库多种用法实例
2020/05/28 Python
Python导入数值型Excel数据并生成矩阵操作
2020/06/09 Python
Python使用Chrome插件实现爬虫过程图解
2020/06/09 Python
Python文件操作及内置函数flush原理解析
2020/10/13 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
2021/01/26 Python
物业工作计划书
2014/01/10 职场文书
二年级语文下册复习计划
2015/01/19 职场文书
学校运动会通讯稿
2015/07/18 职场文书
关于保护环境的建议书
2019/06/24 职场文书
nginx配置文件使用环境变量的操作方法
2021/06/02 Servers
如何用python清洗文件中的数据
2021/06/18 Python
在Centos 8.0中安装Redis服务器的教程详解
2022/03/21 Redis