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 相关文章推荐
通过html表格发电子邮件
Oct 09 PHP
模仿OSO的论坛(五)
Oct 09 PHP
php压缩HTML函数轻松实现压缩html/js/Css及注意事项
Jan 27 PHP
PHP图片裁剪函数(保持图像不变形)
May 04 PHP
php获取网页请求状态程序示例
Jun 17 PHP
yii实现级联下拉菜单的方法
Jul 31 PHP
PHP+JS三级菜单联动菜单实现方法
Feb 24 PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
Jan 27 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
Feb 06 PHP
thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例
Aug 13 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 PHP
PHP 8新特性简介
Aug 18 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 5.0 Pear安装方法
2006/12/06 PHP
使用zend studio for eclipse不能激活代码提示功能的解决办法
2009/10/11 PHP
Php连接及读取和写入mysql数据库的常用代码
2014/08/11 PHP
javascript css在IE和Firefox中区别分析
2009/02/18 Javascript
js 数组实现一个类似ruby的迭代器
2009/10/27 Javascript
ajax+jQuery实现级联显示地址的方法
2015/05/06 Javascript
javascript中$(function() {});写与不写有哪些区别
2015/08/10 Javascript
详解Node.js中的事件机制
2016/09/22 Javascript
js原生之焦点图转换加定时器实例
2016/12/12 Javascript
微信小程序 合法域名校验出错详解及解决办法
2017/03/09 Javascript
浅谈Node.js爬虫之网页请求模块
2018/01/11 Javascript
基于Node.js的大文件分片上传示例
2019/06/19 Javascript
vue路由切换之淡入淡出的简单实现
2019/10/31 Javascript
python常规方法实现数组的全排列
2015/03/17 Python
简单介绍Python中的JSON使用
2015/04/28 Python
Python 实现购物商城,含有用户入口和商家入口的示例
2017/09/15 Python
python实现自动登录后台管理系统
2018/10/18 Python
对django中foreignkey的简单使用详解
2019/07/28 Python
使用Keras建立模型并训练等一系列操作方式
2020/07/02 Python
解决python中0x80072ee2错误的方法
2020/07/19 Python
css3实现波纹特效、H5实现动态波浪效果
2018/01/31 HTML / CSS
纯css3显示隐藏一个div特效的具体实现
2014/02/10 HTML / CSS
CSS3 @font-face属性使用指南
2014/12/12 HTML / CSS
模具数控专业自荐信
2014/01/27 职场文书
电脑专业个人求职信范文
2014/02/04 职场文书
《跨越百年的美丽》教学反思
2014/02/11 职场文书
激情洋溢的毕业生就业求职信
2014/03/15 职场文书
士力架广告词
2014/03/20 职场文书
快餐公司创业计划书
2014/04/29 职场文书
航空学院求职信
2014/06/11 职场文书
党员对照检查材料整改措施思想汇报
2014/09/26 职场文书
校园广播稿范文
2015/08/19 职场文书
2016年度优秀辅导员事迹材料
2016/02/26 职场文书
解决ObjectMapper.convertValue() 遇到的一些问题
2021/06/30 Java/Android
Java中的随机数Random
2022/03/17 Java/Android
CKAD认证中部署k8s并配置Calico插件
2022/03/31 Servers