PHP 中的递归效率
PHP的递归效率一般认为是低效的。大概一年前,我写了一篇博文,对三种遍历树的方法进行了比较,发现递归算法的效率最低。
http://www.cnblogs.com/niniwzw/archive/2008/06/28/1231410.html
而且是差了3倍的效率。所以,PHP中的递归一定要小心的对待。
最近写了一个快速排序的算法,发现PHP中的递归效率不能一刀切,在各种不同的服务器中,可能会表现不一样。
{
_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的版本是一样的。
看来对递归的效率要具体问题具体分析了。