array_searchとin_arrayの比較2

array_keysはとても遅い。でもこれって配列の最後まで検索しているからかな。

果たしてどうなのか。
結果

  • Linux (SuSE), Celeron 2.66GHz, 1GB, PHP 5.2.0
    • [ 0.0088 sec ] [array_search]
    • [ 3.1077 sec ] [array_search2]
    • [ 6.2292sec ] [array_search3]
    • [ 0.0092 sec ] [in_array]
    • [ 3.1003 sec ] [in_array2]
    • [ 6.2772 sec ] [in_array3]
    • [ 7.6481 sec ] [array_keys]
    • [ 7.5052 sec ] [array_keys2]
    • [ 7.3966 sec ] [array_keys3]
  • array_searchとin_array最後まで検索してもarray_keysの方がだいぶ遅い(マッチした結果を保持している分?)。
  • やっぱりarray_searchとin_arrayは変わらない。

array_flipとarray_key_existsをつかったらどうなるのかな。

ソース

define('NUM', 10000);
define('BR', "\n");

for($i=0;$i<NUM;$i++){
  $array[$i] = $i;
}

$time=microtime_float();
for($i=0;$i<NUM;$i++){  array_search(1, $array); }
$end_time=sprintf("%01.04f", microtime_float()-$time);
echo '[ '.$end_time.' sec ] [array_search]'.BR;

$time=microtime_float();
for($i=0;$i<NUM;$i++){  array_search($i, $array); }
$end_time=sprintf("%01.04f", microtime_float()-$time);
echo '[ '.$end_time.' sec ] [array_search2]'.BR;

$time=microtime_float();
for($i=0;$i<NUM;$i++){  array_search(NUM, $array); }
$end_time=sprintf("%01.04f", microtime_float()-$time);echo '[ '.$end_time.'
sec ] [array_search3]'.BR;

$time=microtime_float();
for($i=0;$i<NUM;$i++){  in_array(1, $array); }
$end_time=sprintf("%01.04f", microtime_float()-$time);
echo '[ '.$end_time.' sec ] [in_array]'.BR;

$time=microtime_float();
for($i=0;$i<NUM;$i++){  in_array($i, $array); }
$end_time=sprintf("%01.04f", microtime_float()-$time);
echo '[ '.$end_time.' sec ] [in_array2]'.BR;

$time=microtime_float();
for($i=0;$i<NUM;$i++){  in_array(NUM, $array); }
$end_time=sprintf("%01.04f", microtime_float()-$time);
echo '[ '.$end_time.' sec ] [in_array3]'.BR;

$time=microtime_float();
for($i=0;$i<NUM;$i++){  array_keys($array, 1); }
$end_time=sprintf("%01.04f", microtime_float()-$time);
echo '[ '.$end_time.' sec ] [array_keys]'.BR;

$time=microtime_float();
for($i=0;$i<NUM;$i++){  array_keys($array, $i); }
$end_time=sprintf("%01.04f", microtime_float()-$time);
echo '[ '.$end_time.' sec ] [array_keys2]'.BR;

$time=microtime_float();
for($i=0;$i<NUM;$i++){  array_keys($array, NUM); }
$end_time=sprintf("%01.04f", microtime_float()-$time);
echo '[ '.$end_time.' sec ] [array_keys3]'.BR;

function microtime_float() {
  if(PHP_VERSION >= 5){
    return microtime(true);
  }
  else{
    return array_sum(explode(' ',microtime()));
  }
}