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类的使用 实例代码讲解
Dec 28 PHP
hessian 在PHP中的使用介绍
Dec 13 PHP
改写ThinkPHP的U方法使其路由下分页正常
Jul 02 PHP
destoon实现资讯信息前面调用它所属分类的方法
Jul 15 PHP
ThinkPHP文件上传实例教程
Aug 22 PHP
PHP与MYSQL中UTF8编码的中文排序实例
Oct 21 PHP
php提交表单发送邮件的方法
Mar 20 PHP
详解HTTP Cookie状态管理机制
Jan 14 PHP
详解yii2使用多个数据库的案例
Jun 16 PHP
Laravel利用gulp如何构建前端资源详解
Jun 03 PHP
实例分析10个PHP常见安全问题
Jul 09 PHP
php5.6.x到php7.0.x特性小结
Aug 17 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将向Java靠拢
2006/10/09 PHP
ThinkPHP惯例配置文件详解
2014/07/14 PHP
PHP中preg_match正则匹配中的/u、/i、/s含义
2015/04/17 PHP
基于JQuery+PHP编写砸金蛋中奖程序
2015/09/08 PHP
浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
2019/10/21 PHP
另类调用flash无须激活的方法
2006/12/27 Javascript
JS鼠标事件大全 推荐收藏
2011/11/01 Javascript
JavaScript对象数组的排序处理方法
2015/10/21 Javascript
详解Javascript模板引擎mustache.js
2016/01/20 Javascript
Angular2学习笔记——详解路由器模型(Router)
2016/12/02 Javascript
如何正确理解javascript的模块化
2017/03/02 Javascript
ES6 Promise对象概念与用法分析
2017/04/01 Javascript
p5.js入门教程之小球动画示例代码
2018/03/15 Javascript
页面点击小红心js实现代码
2018/05/26 Javascript
angularjs实现对表单输入改变的监控(ng-change和watch两种方式)
2018/08/29 Javascript
详解Vue项目在其他电脑npm run dev运行报错的解决方法
2018/10/29 Javascript
JavaScript中的事件与异常捕获详析
2019/02/24 Javascript
vue如何在用户要关闭当前网页时弹出提示的实现
2020/05/31 Javascript
js+for循环实现字符串自动转义的代码(把后面的字符替换前面的字符)
2020/12/24 Javascript
vue 项目@change多个参数传值多个事件的操作
2021/01/29 Vue.js
在Windows中设置Python环境变量的实例讲解
2018/04/28 Python
Python3对称加密算法AES、DES3实例详解
2018/12/06 Python
Python整数对象实现原理详解
2019/07/01 Python
matplotlib更改窗口图标的方法示例
2021/02/03 Python
python 多线程爬取壁纸网站的示例
2021/02/20 Python
浅析python连接数据库的重要事项
2021/02/22 Python
CSS3制作轮播图的一种方法
2019/11/11 HTML / CSS
英国知名美妆护肤在线商城:Zest Beauty
2018/04/24 全球购物
联想台湾官网:Lenovo TW
2018/05/09 全球购物
质量承诺书范文
2014/03/27 职场文书
公司副总经理岗位职责
2014/10/01 职场文书
2014年党建工作汇报材料
2014/11/02 职场文书
2014年党务工作总结
2014/11/25 职场文书
2015年社区平安建设工作总结
2015/05/13 职场文书
2015年艾滋病防治工作总结
2015/05/22 职场文书
Python自动化测试PO模型封装过程详解
2021/06/22 Python