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脚本的10个技巧(4)
Oct 09 PHP
frename PHP 灵活文件命名函数 frename
Sep 09 PHP
php设计模式 Strategy(策略模式)
Jun 26 PHP
php引用地址改变变量值的问题
Mar 23 PHP
php防注入,表单提交值转义的实现详解
Jun 10 PHP
探讨:如何通过stats命令分析Memcached的内部状态
Jun 14 PHP
Parse正式发布开源PHP SDK
Aug 11 PHP
PHP中提问频率最高的11个面试题和答案
Sep 02 PHP
Zend Framework教程之模型Model基本规则和使用方法
Mar 04 PHP
ThinkPHP框架搭建及常见问题(XAMPP安装失败、Apache/MySQL启动失败)
Apr 15 PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
Jul 25 PHP
分享PHP-pcntl 实现多进程代码
Sep 30 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
对squid中refresh_pattern的一些理解和建议
2009/04/17 PHP
PHP下获取上个月、下个月、本月的日期(strtotime,date)
2014/02/02 PHP
Yii中创建自己的Widget实例
2016/01/05 PHP
php rsa 加密,解密,签名,验签详解
2016/12/06 PHP
通过JAVASCRIPT读取ASP设定的COOKIE
2006/11/24 Javascript
传智播客学习之java 反射
2009/11/22 Javascript
js查错流程归纳
2012/05/04 Javascript
js用Date对象处理时间实现思路及代码
2013/01/31 Javascript
JavaScript四种调用模式和this示例介绍
2014/01/02 Javascript
ie9 提示'console' 未定义问题的解决方法
2014/03/20 Javascript
JS判断页面是否出现滚动条的方法
2015/07/17 Javascript
jQuery实现的分子运动小球碰撞效果
2016/01/27 Javascript
写jQuery插件时的注意点
2017/02/20 Javascript
hammer.js实现图片手势放大效果
2017/08/29 Javascript
vue-router 组件复用问题详解
2018/01/22 Javascript
jquery.onoff实现简单的开关按钮功能(推荐)
2018/05/24 jQuery
一秒学会微信小程序制作table表格
2019/02/14 Javascript
微信公众号平台接口开发 获取access_token过程解析
2019/08/14 Javascript
Vue的状态管理vuex使用方法详解
2020/02/05 Javascript
vue 组件间的通信之子组件向父组件传值的方式
2020/07/29 Javascript
pytyon 带有重复的全排列
2013/08/13 Python
python使用pil生成图片验证码的方法
2015/05/08 Python
Python统计日志中每个IP出现次数的方法
2015/07/06 Python
python模拟登录并且保持cookie的方法详解
2017/04/04 Python
Django使用Mysql数据库已经存在的数据表方法
2018/05/27 Python
Python字符串对象实现原理详解
2019/07/01 Python
简单了解django orm中介模型
2019/07/30 Python
css3通过scale()、rotate()实现放大、旋转
2020/03/19 HTML / CSS
HTML5中FileReader接口使用方法实例详解
2017/08/26 HTML / CSS
浅谈three.js中的needsUpdate的应用
2012/11/12 HTML / CSS
Michael Kors美国官网:美式奢侈生活风格的代表
2016/11/25 全球购物
自主招生自荐信指南
2014/02/04 职场文书
工伤赔偿协议书范本
2014/04/15 职场文书
副科竞争上岗演讲稿
2014/05/12 职场文书
中学团支部工作总结
2015/08/13 职场文书
python装饰器代码解析
2022/03/23 Python