• PHP中二维数组排序 usort 和 array_multisort 的使用和性能比较


    usort 和 array_multisort 的使用

    function test()
    {
        $data = [
            ['name' => '张三', 'sort' => 60],
            ['name' => '李四', 'sort' => 50],
            ['name' => '王五', 'sort' => 80],
        ];
    
        // 一、按照sort字段顺序排序
        // 1、usort
        usort($data, function ($a, $b) {
            if ($a['sort'] == $b['sort']) {
                return 0;
            }
            return $a['sort'] > $b['sort'] ? 1 : -1;
        });
    
        // 2、array_multisort
        array_multisort(array_column($data, 'sort'), SORT_ASC, $data);
    
        // 二、按照sort字段倒序排序
        // 1、usort
        usort($data, function ($a, $b) {
            if ($a['sort'] == $b['sort']) {
                return 0;
            }
            return $a['sort'] < $b['sort'] ? 1 : -1;
        });
    
        // 2、array_multisort
        array_multisort(array_column($data, 'sort'), SORT_DESC, $data);
    }

    usort 和 array_multisort性能测试

    1、1000数据量

    function test()
    {
        $data = [];
        for ($i = 1; $i <= 1000; $i++) {
            $data[] = ['sort' => mt_rand(1, 100000000)];
        }
    
        $startTime = microtime(true);
    
        // 测试usort
        usort($data, function ($a, $b) {
            if ($a['sort'] == $b['sort']) {
                return 0;
            }
            return $a['sort'] < $b['sort'] ? 1 : -1;
        });
    
        // 测试array_multisort
    //    array_multisort(array_column($data, 'sort'), SORT_DESC, $data);
    
        $endTime = microtime(true);
        $subTime = $endTime - $startTime;
    
        echo $subTime;exit;
    }

    测试结果:
    usort :0.0015461444854736 波动范围在 0.001 ~ 0.002
    array_multisort:0.00037407875061035 波动范围在 0.0002 ~ 0.0004

    2、10000数据量

    function test()
    {
        $data = [];
        for ($i = 1; $i <= 10000; $i++) {
            $data[] = ['sort' => mt_rand(1, 100000000)];
        }
    
        $startTime = microtime(true);
    
        // 测试usort
        usort($data, function ($a, $b) {
            if ($a['sort'] == $b['sort']) {
                return 0;
            }
            return $a['sort'] < $b['sort'] ? 1 : -1;
        });
    
        // 测试array_multisort
    //    array_multisort(array_column($data, 'sort'), SORT_DESC, $data);
    
        $endTime = microtime(true);
        $subTime = $endTime - $startTime;
    
        echo $subTime;exit;
    }

    测试结果:
    usort :0.021894931793213 波动范围在 0.020 ~ 0.023
    array_multisort:0.0053129196166992 波动范围在 0.0036 ~ 0.0078

    3、100000数据量

    function test()
    {
        $data = [];
        for ($i = 1; $i <= 100000; $i++) {
            $data[] = ['sort' => mt_rand(1, 100000000)];
        }
    
        $startTime = microtime(true);
    
        // 测试usort
        usort($data, function ($a, $b) {
            if ($a['sort'] == $b['sort']) {
                return 0;
            }
            return $a['sort'] < $b['sort'] ? 1 : -1;
        });
    
        // 测试array_multisort
    //    array_multisort(array_column($data, 'sort'), SORT_DESC, $data);
    
        $endTime = microtime(true);
        $subTime = $endTime - $startTime;
    
        echo $subTime;exit;
    }

    测试结果:
    usort :0.29409503936768 波动范围在 0.29 ~ 0.31
    array_multisort:0.060003042221069 波动范围在 0.058 ~ 0.078

    4、500000数据量

    function test()
    {
        $data = [];
        for ($i = 1; $i <= 500000; $i++) {
            $data[] = ['sort' => mt_rand(1, 100000000)];
        }
    
        $startTime = microtime(true);
    
        // 测试usort
        usort($data, function ($a, $b) {
            if ($a['sort'] == $b['sort']) {
                return 0;
            }
            return $a['sort'] < $b['sort'] ? 1 : -1;
        });
    
        // 测试array_multisort
    //    array_multisort(array_column($data, 'sort'), SORT_DESC, $data);
    
        $endTime = microtime(true);
        $subTime = $endTime - $startTime;
    
        echo $subTime;exit;
    }

    测试结果:
    usort :2.0687599182129 波动范围在 2.04 ~ 2.24
    array_multisort:0.40970206260681 波动范围在 0.39 ~ 0.41

    结论:从测试结果来看,无论数据量多大,array_multisort 的速度都要比 usort 快很多。

     

     
  • 相关阅读:
    BZOJ 2055 80人环游世界 有上下界最小费用可行流
    BZOJ 2406 LuoguP4194 矩阵 有上下界可行流
    BZOJ4873 LuoguP3749 寿司餐厅
    51nod 1551 集合交易 最大权闭合子图
    BZOJ 1565 植物大战僵尸 最大权闭合子图+网络流
    [CodeForces]460C Present
    [BZOJ5072] 小A的树
    [TJOI2015]组合数学
    [HNOI2006]鬼谷子的钱袋
    [IOI2007]矿工配餐
  • 原文地址:https://www.cnblogs.com/woods1815/p/14587385.html
Copyright © 2020-2023  润新知