memo-pad’s blog

自分のためのメモをまとめています。ここに書いてある内容については責任は負いません。全て自己責任でお願いします。

phpのin_array, array_key_exists, issetの速度比較

phpのバージョンは5.6.29

実行結果

$ php isset.php 
isset
5.6982040405273E-7seconds

$ php array_key_exists.php 
array_key_exists
1.3089179992676E-6seconds

$ php in_array.php 
in_array
0.011404228210449seconds

$ php or.php 
||
0.028414559364319seconds

速さはisset, array_key_exists, in_array, 論理演算子の順番で大体イメージ通りの結果になりました。
やっぱりissetやarray_key_existsと比較するとin_arrayは遅いですね。
ただ、issetとarray_key_existsはin_arrayと違ってkeyに対して探索行わせるので、そのために下記のように毎回array_flip噛ませるとかやってると逆に遅くなって本末転倒なので注意

$ php isset_flip.php
isset_flip
0.059537370204926seconds

$ php array_key_exists_flip.php
array_key_exists_flip
0.058682680130005seconds

今回のコード

github.com

isset.php
<?php
$search_number = 99999;
$list = range(0, 99999);
$loop_count = 100;

echo "isset\n";
$start_time = microtime(true);
for ($i=0; $i<$loop_count; $i++) {
    if (isset($list[$search_number])) {}
}
$time = microtime(true) - $start_time;
echo $time/$loop_count . "seconds\n";
array_key_exists.php
<?php
$search_number = 99999;
$list = range(0, 99999);
$loop_count = 100;

echo "array_key_exists\n";
$start_time = microtime(true);
for ($i=0; $i<$loop_count; $i++) {
    if (array_key_exists($search_number, $list)) {}
}
$time = microtime(true) - $start_time;
echo $time/$loop_count . "seconds\n";
in_array.php
<?php
$search_number = 99999;
$list = range(0, 99999);
$loop_count = 100;

echo "in_array\n";
$start_time = microtime(true);
for ($i=0; $i<$loop_count; $i++) {
    if (in_array($search_number, $list, true)) {}
}
$time = microtime(true) - $start_time;
echo $time/$loop_count . "seconds\n";
or.php
<?php
$search_number = 99999;
$list = range(0, 99999);
$loop_count = 100;

echo "||\n";
$start_time = microtime(true);
for ($i=0; $i<$loop_count; $i++) {
    if ($search_number === 0 ||
        $search_number === 1 ||
〜〜〜〜〜〜〜〜〜〜〜〜〜略〜〜〜〜〜〜〜〜〜〜〜〜〜
        $search_number === 99999) {}
    }
$time = microtime(true) - $start_time;
echo $time/$loop_count . "seconds\n";
isset_flip.php
<?php
$search_number = 99999;
$list = range(0, 99999);
$loop_count = 100;

echo "isset_flip\n";
$start_time = microtime(true);
for ($i=0; $i<$loop_count; $i++) {
    $flipped_list = array_flip($list);
    if (isset($flipped_list[$search_number])) {}
}
$time = microtime(true) - $start_time;
echo $time/$loop_count . "seconds\n";
array_key_exists_flip.php
<?php
$search_number = 99999;
$list = range(0, 99999);
$loop_count = 100;

echo "array_key_exists_flip\n";
$start_time = microtime(true);
for ($i=0; $i<$loop_count; $i++) {
    $flipped_list = array_flip($list);
    if (array_key_exists($search_number, $flipped_list)) {}
}
$time = microtime(true) - $start_time;
echo $time/$loop_count . "seconds\n";