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编程实现获取excel文档内容的代码实例
Jun 28 PHP
php验证手机号码(支持归属地查询及编码为UTF8)
Feb 01 PHP
php session劫持和防范的方法
Nov 12 PHP
Smarty局部缓存的几种方法简介
Jun 17 PHP
PHP中array_slice函数用法实例详解
Nov 25 PHP
Smarty使用自定义资源的方法
Aug 08 PHP
WordPress中创建用户角色的相关PHP函数使用详解
Dec 25 PHP
yii2 数据库读写分离配置示例
Feb 10 PHP
php 使用curl模拟ip和来源进行访问的实现方法
May 02 PHP
PHP 网站修改默认访问文件的nginx配置
May 27 PHP
PHP微信企业号开发之回调模式开启与用法示例
Nov 25 PHP
关于Curl在Swoole协程中的解决方案详析
Sep 12 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
ThinkPHP的截取字符串函数无法显示省略号的解决方法
2014/06/25 PHP
自己写的php curl库实现整站克隆功能
2015/02/12 PHP
php正则表达式获取内容所有链接
2015/07/24 PHP
基于ThinkPHP5框架使用QueryList爬取并存入mysql数据库操作示例
2019/05/25 PHP
JavaScript中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
2010/08/12 Javascript
html的DOM中Event对象onblur事件用法实例
2015/01/21 Javascript
JavaScript设置body高度为浏览器高度的方法
2015/02/09 Javascript
JavaScript使用yield模拟多线程的方法
2015/03/19 Javascript
javascript事件委托的方式绑定详解
2015/06/10 Javascript
AngularJS基础 ng-mouseenter 指令示例代码
2016/08/02 Javascript
JavaScript严格模式详解
2017/01/16 Javascript
JavaScript上传文件时不用刷新页面方法总结(推荐)
2017/08/15 Javascript
浅谈vue2 单页面如何设置网页title
2017/11/08 Javascript
浅析TypeScript 命名空间
2020/03/19 Javascript
解决await在forEach中不起作用的问题
2021/02/25 Javascript
[02:20]DOTA2亚洲邀请赛 IG战队出场宣传片
2015/02/07 DOTA
Python的动态重新封装的教程
2015/04/11 Python
python操作列表的函数使用代码详解
2017/12/28 Python
python字典快速保存于读取的方法
2018/03/23 Python
Python实现的远程登录windows系统功能示例
2018/06/21 Python
Python实现通过解析域名获取ip地址的方法分析
2019/05/17 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
2020/08/04 Python
Expedia英国:全球最大的在线旅游公司
2017/09/07 全球购物
英国领先品牌手动工具和电动工具供应商:Tooled Up
2018/11/24 全球购物
最畅销的视频游戏享受高达90%的折扣:CDKeys
2020/02/10 全球购物
九年级家长会邀请函
2014/01/15 职场文书
美国探亲签证邀请信
2014/02/05 职场文书
酒店开业庆典主持词
2014/03/21 职场文书
司仪主持词两篇
2014/03/22 职场文书
房屋公证委托书
2014/04/03 职场文书
大学生求职信
2014/06/17 职场文书
大三学生英语考试作弊检讨书
2015/01/01 职场文书
委托书格式范文
2015/01/28 职场文书
病危通知书样本
2015/04/17 职场文书
代理词怎么写
2015/05/25 职场文书
python 如何执行控制台命令与操作剪切板
2021/05/20 Python