
正文
PHP性能优化:in_array和isset 在大数组查询中耗时相差巨大,以及巧妙使用array_flip
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
今天在PHP业务开发中,发现了一个问题。
两个较大数组(20万+元素),遍历其中一个$a,另一个数组$b用于查找元素。
比如
foreach($a as $val){
if(in_array($xx, $b)){
//
}
}
发现速度非常之慢,加上业务处理,耗时快半个小时之久。
排查之后发现in_array()的速度很慢。
怎么样优化呢?在php数组中,如果用in_array 或者 array_search 这种寻找数组value值的,php会整个遍历一遍查询,这样当数组很大时,当然会很慢。
而考虑使用array_key_exists 或者 语言构造器isset 则会很快。
但是这两个用法需要value是key才行,非常幸运,php是世界上最好的语言。。array_flip()提供了这个用法。
所以:
$c = array_flip($b);
foreach($a as $val){
if(isset($c[$xx])){
//
}
}
速度瞬间起来了~
来一段测试代码:
<?phpset_time_limit(0);$arr = range(1, 100000);
$arr1 = array_flip($arr);$len = count($arr);$j = 5000;// array_key_exists
$begin = time();
for($i = 0; $i < $len; $i++){
if(array_key_exists($j, $arr1)){
}
}
echo "array_key_exists:".(time() - $begin)."\r\n";// isset
$begin = time();
for($i = 0; $i < $len; $i++){
if(isset($arr1[$j])){
}
}
echo "isset:".(time() - $begin)."\r\n";// in_array
$begin = time();
for($i = 0; $i < $len; $i++){
if(in_array($j, $arr)){
}
}
echo "in_array:".(time() - $begin)."\r\n";/**
*
array_key_exists:0
isset:0
in_array:17
*/
再贴个真实业务上对比:
一个4s,一个1746s








