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 相关文章推荐
新版mysql+apache+php Linux安装指南
Oct 09 PHP
php记录日志的实现代码
Aug 08 PHP
php中设置多级目录session的问题
Aug 08 PHP
php连接函数implode与分割explode的深入解析
Jun 26 PHP
php数组索引的Key加引号和不加引号的区别
Aug 19 PHP
PHP file_get_contents函数读取远程数据超时的解决方法
May 13 PHP
php日期操作技巧小结
Jun 25 PHP
php redis实现对200w用户的即时推送
Mar 04 PHP
PHP+Apache环境中如何隐藏Apache版本
Nov 24 PHP
PHP使用反向Ajax技术实现在线客服系统详解
Jul 01 PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
Jul 24 PHP
php装饰者模式简单应用案例分析
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对csv文件的读取,写入,输出下载操作详解
2013/08/10 PHP
PHP删除指定目录中的所有目录及文件的方法
2015/02/26 PHP
PHP curl模拟登录带验证码的网站
2015/11/30 PHP
JS编程小常识很有用
2012/11/26 Javascript
Javascript中call的两种用法实例
2013/12/13 Javascript
当某个文本框成为焦点时即清除文本框内容
2014/04/28 Javascript
JavaScript获得页面base标签中url的方法
2015/04/03 Javascript
基于js实现微信发送好友如何分享到朋友圈、微博
2015/11/30 Javascript
nodejs 中模拟实现 emmiter 自定义事件
2016/02/22 NodeJs
JavaScript的ExtJS框架中数面板TreePanel的使用实例解析
2016/05/21 Javascript
半个小时学json(json传递示例)
2016/12/25 Javascript
vue实现仿淘宝结账页面实例代码
2017/11/08 Javascript
解析Angular 2+ 样式绑定方式
2018/01/15 Javascript
Vue 创建组件的两种方法小结(必看)
2018/02/23 Javascript
js实现星星打分效果
2020/07/05 Javascript
Python中文竖排显示的方法
2015/07/28 Python
利用Python获取操作系统信息实例
2016/09/02 Python
python获取当前文件路径以及父文件路径的方法
2019/07/10 Python
通过python改变图片特定区域的颜色详解
2019/07/15 Python
Django中FilePathField字段的用法
2020/05/21 Python
Python实现进度条和时间预估的示例代码
2020/06/02 Python
Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)
2020/06/23 Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
2020/12/22 Python
网页设计个人找工作求职信
2013/11/28 职场文书
品质管理部岗位职责范文
2014/03/01 职场文书
课外科技活动总结
2014/08/27 职场文书
我的未来不是梦演讲稿
2014/09/02 职场文书
2014年销售经理工作总结
2014/12/01 职场文书
浅析InnoDB索引结构
2021/04/05 MySQL
python numpy中setdiff1d的用法说明
2021/04/22 Python
Redis持久化与主从复制的实践
2021/04/27 Redis
element多个表单校验的实现
2021/05/27 Javascript
浅谈TypeScript 索引签名的理解
2021/10/16 Javascript
Kubernetes控制节点的部署
2022/04/01 Servers
Golang日志包的使用
2022/04/20 Golang
Windows Server 修改远程桌面端口的实现
2022/06/25 Servers