今天在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])){ // } }
速度瞬間起來了~
來一段測試代碼:
<?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