PHPIN.NET

 找回密码
 立即注册
查看: 418|回复: 0

[高级进阶] php自己实现排序算法和usort性能能差多少

[复制链接]

454

主题

480

帖子

4247

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4247
发表于 2019-2-13 11:56:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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

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

生成随机数据库记录
  1. //生成随机字符串
  2. function RandomString($length)
  3. {
  4.     $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  5.     $randstring = '';
  6.     for ($i = 0; $i < $length; $i++) {
  7.         $pos = rand(0, strlen($characters) - 1);
  8.         $randstring .= $characters[$pos];
  9.     }
  10.     return $randstring;
  11. }

  12. //生成对象数据
  13. function generate_random_objects($keys, $quantity){
  14.     $objects = [];
  15.     for($i=0; $i < $quantity; $i++){
  16.         $obj = [];
  17.         for($j=0; $j < count($keys); $j++){
  18.             $length = rand(0, 100);
  19.             $str = RandomString($length);
  20.             $obj[$keys[$j]] = $str;
  21.         }

  22.         $objects[] = $obj;
  23.     }

  24.     return $objects;
  25. }
复制代码

第一种排序采用php编写冒泡排序
  1. function method1($objects){
  2.     $count = count($objects);
  3.     for($i = 0; $i < $count; $i++){
  4.         for($j = $count-1; $j > $i; $j--){

  5.             if(strlen($objects[$j]['a']) > strlen($objects[$j-1]['a'])){
  6.                 $temp = $objects[$j];
  7.                 $objects[$j] = $objects[$j-1];
  8.                 $objects[$j-1] = $temp;
  9.             }
  10.         }
  11.     }
  12. }
复制代码

第二种排序使用usort函数实现
  1. function method2($objects){
  2.     usort($objects,function($a, $b){
  3.         return strlen($a['a']) > strlen($b['a']);
  4.     });
  5. }
复制代码

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

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

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

  16. test(1000);
  17. test(5000);
  18. test(10000);
  19. test(50000);
复制代码


实验结果
上图吧,图中运行时间单位为秒
demo.png
到50000数据规模的时候,自己的排序代码已经逆天了,477秒。

以上文章来自网友 楚天乐的小站 (需自备梯子)版权归作者所有,本站仅转发整理。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|PHPIN.NET ( 冀ICP备00000001号 )|网站地图

GMT+8, 2019-7-18 19:56

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表