大数据数组的快速去重以及提高元素查找效率
最近一个项目的研究,在大量数据下,PHP如何快速的在数组中去除重复元素和快速查找需要的元素信息。采用多种不同方法进行对比,最终得出下列效率最高的方法。
快速去重
对数组元素进行去重,一般会使用 array_unique 方法。
unique count:99
run time:653.39303016663ms
use memory:5120kb
现在采用键值互换的方法 array_flip,可以使用这个方法进行键值互换,原来重复的值会变为相同的元素键,进行去重。最后再进行一次键值互换,把键和值换回来则可以完成去重。
<?php
$arr = array();
// 创建100000个随机元素的数组
for($i=0; $i<100000; $i++){
$arr[] = mt_rand(1,99);
}
// 使用键值互换去重
$arr = array_flip($arr);
$arr = array_flip($arr);
监控结果:
unique count:99
run time:12.840032577515ms
use memory:768kb
快速查找
查找数组元素是否存在,一般会使用 in_array 方法。
unique count:100000
run time:163.16294670105ms
use memory:6148kb
现在先使用 array_flip 进行键值互换,然后使用 isset 方法来判断元素是否存在。
<?php
$arr = array();
// 创建10万个元素的数组
for($i=0; $i<100000; $i++){
$arr[] = $i;
}
// 键值互换
$arr = array_flip($arr);
// 随机创建1000个数字使用isset比较
for($j=0; $j<1000; $j++){
$str = mt_rand(1,99999);
isset($arr[$str]);
}
监控结果:
unique count:100000
run time:0.40984153747559ms
use memory:6148kb
记录实验数据相关代码
<?php
// 记录开始时间
$starttime = getMicrotime();
### 实验代码部分 ###
// 记录
$endtime = getMicrotime();
$arr = array_values($arr);
echo "unique count:".count($arr)."<br>";
echo "run time:".(float)(($endtime-$starttime)*1000)."ms<br>";
echo "use memory:".getUseMemory();
/**
* 获取使用内存
* @return float
*/
function getUseMemory(){
$use_memory = round(memory_get_usage(true)/1024,2)."kb";
return $use_memory;
}
/**
* 获取 Microtime
* @return float
*/
function getMicrotime(){
list($usec, $sec) = explode(" ", microtime());
return (float)$usec + (float)$sec;
}