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])){
        //
    }
}

  速度瞬間起來了~

 

  來一段測試代碼:

<?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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM