PHP性能優化:in_array和isset 在大數組查詢中耗時相差巨大,以及巧妙使用array_flip

  今天在PHP業務開發中,發現了一個問題。php

  兩個較大數組(20萬+元素),遍歷其中一個$a,另外一個數組$b用於查找元素。數組

  好比測試

foreach($a as $val){
    if(in_array($xx, $b)){
        //
    }
}

  發現速度很是之慢,加上業務處理,耗時快半個小時之久。優化

  排查以後發現in_array()的速度很慢。spa

  怎麼樣優化呢?在php數組中,若是用in_array 或者 array_search 這種尋找數組value值的,php會整個遍歷一遍查詢,這樣當數組很大時,固然會很慢。code

  而考慮使用array_key_exists 或者 語言構造器isset 則會很快。blog

  可是這兩個用法須要value是key才行,很是幸運,php是世界上最好的語言。。array_flip()提供了這個用法。ip

  因此: 開發

$c = array_flip($b);
foreach($a as $val){
    if(isset($c[$xx])){
        //
    }
}

  速度瞬間起來了~it

 

  來一段測試代碼:

<?php

set_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

相關文章
相關標籤/搜索