例えばループ処理中重複した値を弾きたい場合、下記2つのアプローチではどちらが高速なのだろうか。
1, キャッシュ配列に値を詰め込みその後、in_array()を用いて重複値をチェックする
2, 値を配列のキーに持たせ、isset()にて添字の存在チェックい重複を弾く
結果は以下のとおり。
$cache = array(); $start = microtime(true); for($i = 0; $i < 10000; $i++) { $md5 = md5($i); if(!in_array($md5, $cache)) { $cache[] = $md5; } } $end = microtime(true); echo $end - $start."\n"; $cache = array(); $start = microtime(true); for($i = 0; $i < 10000; $i++) { $md5 = md5($i); if(!isset($cache[$md5])) { $cache[$md5] = true; } } $end = microtime(true); echo $end - $start."\n";
上はin_array()、下はisset()
5.5056478977203 0.020223140716553
その差は272倍。
圧倒的に添字アクセスの方が速い。