php自己实现排序算法和usort性能能差多少

楚天乐 349 0 条

实验目标

对比两种php排序方法的性能差异。第一种,php代码实现冒泡排序,第二种使用php内置函数usort排序。

实验设计

先生成一定规模的字符串,然后使用两种排序方法分别对齐排序,并对比运行时间。

排序要求:
假设我们有一大堆数据库记录,每条记录包含"a","b","c","d"四个字段。我们需要根据"a"字段的字符长度来进行降续排列。

  • 生成随机数据库记录
//生成随机字符串
function RandomString($length)
{
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $randstring = '';
    for ($i = 0; $i < $length; $i++) {
        $pos = rand(0, strlen($characters) - 1);
        $randstring .= $characters[$pos];
    }
    return $randstring;
}

//生成对象数据
function generate_random_objects($keys, $quantity){
    $objects = [];
    for($i=0; $i < $quantity; $i++){
        $obj = [];
        for($j=0; $j < count($keys); $j++){
            $length = rand(0, 100);
            $str = RandomString($length);
            $obj[$keys[$j]] = $str;
        }

        $objects[] = $obj;
    }

    return $objects;
}
  • 第一种排序采用php编写冒泡排序。
function method1($objects){
    $count = count($objects);
    for($i = 0; $i < $count; $i++){
        for($j = $count-1; $j > $i; $j--){

            if(strlen($objects[$j]['a']) > strlen($objects[$j-1]['a'])){
                $temp = $objects[$j];
                $objects[$j] = $objects[$j-1];
                $objects[$j-1] = $temp;
            }
        }
    }
}
  • 第二种排序使用usort函数实现
function method2($objects){
    usort($objects,function($a, $b){
        return strlen($a['a']) > strlen($b['a']);
    });
}

测试代码

function test($quantity){
    echo $quantity . "规模测试\n";
    // 生成随机对象1000个
    $objects = generate_random_objects(["a", "b", "c", "d"], $quantity);

    $stime=microtime(true);
    method1($objects);
    $etime=microtime(true);
    $total1 = $etime-$stime;
    echo "自定义排序耗时: " .$total1 . "\n";

    $stime=microtime(true);
    method2($objects);
    $etime=microtime(true);
    $total2 = $etime-$stime;
    echo "usort排序耗时: " . $total2 . "\n";
}

test(1000);
test(5000);
test(10000);
test(50000);

实验结果

上图吧,图中运行时间单位为秒
usort性能.png

到50000数据规模的时候,自己的排序代码已经逆天了,477秒。

打赏

微信打赏

支付宝打赏



发表我的评论
'
昵称 (必填)
邮箱 (必填)
网址