はじめに
in_arrayを使うより、連想配列にしてissetとかで判定した方が早いよという会話を聞いたので、実際に速度を計測してどの程度の差があるのかを確認しました。
せっかくなので配列に値を入れる時にarray_pushを使って、こちらの計測も行います。
array_pushと[] = の比較
まずはin_arrayで計測をするようの配列を準備したいので、配列に値を入れていきます。
その際にせっかくなので、array_pushで値を追加する場合と$array[] = 'hoge' みたいな形で追加する場合のパフォーマンスについて計測してみます。
$array = [];
$start = microtime(true) * 1000;
for ($i = 0; $i < 10000; $i++) {
array_push($array, $i);
}
$end = microtime(true) * 1000;
echo $end - $start; // 10.2802734375
$array2 = [];
$start = microtime(true) * 1000;
for ($i = 0; $i < 10000; $i++) {
$array2[] = $i;
}
$end = microtime(true) * 1000;
echo $end - $start; // 3.06103515625
結果のまとめ
何度かやると上振れ下振れしますが、それぞれの差はあまり変わりませんでした。
だいたい3倍から4倍と行った印象です。
処理 | 実行速度 |
---|---|
array_push | 10.2802734375 |
[] = | 3.06103515625 |
in_arrayとissetの比較
配列の準備ができたので、そこから値を検索するパフォーマンスの計測を行ってみます。
// in_array
$start = microtime(true) * 1000;
in_array(5000, $array);
$end = microtime(true) * 1000;
echo $end - $start; // 0.123046875
// isset
$start = microtime(true) * 1000;
isset($array[5000]);
$end = microtime(true) * 1000;
echo $end - $start; // 0.0048828125
追加で似たような処理を行う組み込み関数も計測してみます。
// array_search
$start = microtime(true) * 1000;
array_search(5000, $array);
$end = microtime(true) * 1000;
echo $end - $start; // 0.089111328125
// array_key_exists
$start = microtime(true) * 1000;
array_key_exists(5000, $array2);
$end = microtime(true) * 1000;
echo $end - $start; // 0.005859375
結果のまとめ
処理 | 実行速度 |
---|---|
in_array | 0.123046875 |
array_search | 0.089111328125 |
isset | 0.0048828125 |
array_key_exists | 0.005859375 |
単純に今回の比較ですとこのような差が出ました。(25倍くらい?)
そのためデータの件数が多い場合には、連想配列にしてissetでの判定ができないか試してみるは良さそうです。