今天在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