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同时支持GIF、png、JPEG
Oct 09 PHP
PHP学习散记_编码(json_encode 中文不显示)
Nov 10 PHP
php中explode与split的区别介绍
Oct 03 PHP
深入解析phpCB批量转换的代码示例
Jun 27 PHP
PHP之APC缓存详细介绍 apc模块安装
Jan 13 PHP
smarty模板中拼接字符串的方法
Feb 14 PHP
yii去掉必填项中星号的方法
Dec 28 PHP
php实时倒计时功能实现方法详解
Feb 27 PHP
php实现自定义中奖项数和概率的抽奖函数示例
May 26 PHP
php的常量和变量实例详解
Jun 27 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
Jul 19 PHP
laravel框架中控制器的创建和使用方法分析
Nov 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类的自动载入机制
2016/09/16 PHP
PHP实现多级分类生成树的方法示例
2017/02/07 PHP
php实现统计二进制中1的个数算法示例
2018/01/23 PHP
PHP多进程通信-消息队列使用
2019/03/08 PHP
cssQuery()的下载与使用方法
2007/01/12 Javascript
js 禁用浏览器的后退功能的简单方法
2008/12/10 Javascript
window.open不被拦截的实现代码
2012/08/22 Javascript
js 关键词高亮(根据ID/tag高亮关键字)案例介绍
2013/01/21 Javascript
谷歌浏览器不支持showModalDialog模态对话框的解决方法
2014/09/22 Javascript
javascript中CheckBox全选终极方案
2015/05/20 Javascript
怎么通过onclick事件获取js函数返回值(代码少)
2015/07/28 Javascript
解析JavaScript实现DDoS攻击原理与保护措施
2016/12/26 Javascript
jQuery插件form-validation-engine正则表达式操作示例
2017/02/09 Javascript
解决angularJS中input标签的ng-change事件无效问题
2018/09/13 Javascript
在vue项目中引用Iview的方法
2018/09/14 Javascript
vue实现pdf导出解决生成canvas模糊等问题(推荐)
2018/10/18 Javascript
移动端手指操控左右滑动的菜单
2019/09/08 Javascript
vant 自定义 van-dropdown-item的用法
2020/08/05 Javascript
JavaScript实现矩形块大小任意缩放
2020/08/25 Javascript
wepy--用vantUI 实现上弹列表并选择相应的值操作
2020/11/03 Javascript
[01:59]DOTA2首部纪录片《Free to play》预告片
2014/03/12 DOTA
python检查URL是否正常访问的小技巧
2017/02/25 Python
python使用flask与js进行前后台交互的例子
2019/07/19 Python
python爬虫 模拟登录人人网过程解析
2019/07/31 Python
pytorch获取vgg16-feature层输出的例子
2019/08/20 Python
python GUI库图形界面开发之PyQt5信号与槽多窗口数据传递详细使用方法与实例
2020/03/08 Python
python 瀑布线指标编写实例
2020/06/03 Python
浅谈TensorFlow之稀疏张量表示
2020/06/30 Python
Python虚拟环境virtualenv创建及使用过程图解
2020/12/08 Python
红色连衣裙精品店:Red Dress Boutique
2018/08/11 全球购物
屈臣氏菲律宾官网:Watsons菲律宾
2020/06/30 全球购物
Java平台和其他软件平台有什么不同
2015/06/05 面试题
WEB控件及HTML服务端控件能否调用客户端方法?如果能,请解释如何调用?
2015/08/25 面试题
化学专业自荐信
2014/05/28 职场文书
七年级地理教学计划
2015/01/22 职场文书
深入浅出的讲解:信号调制到底是如何实现的
2022/02/18 无线电