admin 发表于 2019-2-13 11:56:42

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

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);

实验结果
上图吧,图中运行时间单位为秒

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

以上文章来自网友 楚天乐的小站 (需自备梯子)版权归作者所有,本站仅转发整理。
页: [1]
查看完整版本: php自己实现排序算法和usort性能能差多少