suin.io

in_arrayとpreg_matchの速度比較

suin2008年11月19日

in_arrayとpreg_matchでにたような処理

in_arrayとpreg_matchで候補の文字列にマッチするかどうかを判定することができます。
  • preg_match('/^(ab|cd|ef)$/', $str)
  • in_array($str, array('ab', 'cd', 'ef')
そこでどちらが、より高速なのか実験してみました。

比較対象はつぎの3つです。

  1. preg_match
  2. in_array(文字列候補の配列はそのつど生成するばあい)
  3. in_array(文字列候補の配列を生成するのは1回だけのばあい)

実験はつぎのようなコードで行いました。

<?php

$str = 'yz';

//
// preg_match test area
//

$startTime = microtime(true);

for ( $i = 0; $i < 100000; $i++ ) {
if ( preg_match('/^(ab|cd|ef|gh|ij|kl|mn|op|qr|st|uv|wx|yz)$/', $str) ) {}
}

$endTime = microtime(true);

echo 'preg_match()<br />';
echo $endTime - $startTime . 'sec<br />';

//
// in_array test area
//

$startTime = microtime(true);

for ( $i = 0; $i < 100000; $i++ ) {
if ( in_array($str, array('ab', 'cd', 'ef', 'gh',
'ij', 'kl', 'mn', 'op', 'qr',
'st', 'uv', 'wx', 'yz')) ) {}
}

$endTime = microtime(true);

echo 'in_array()<br />';
echo $endTime - $startTime . 'sec<br />';

//
// in_array + $array test area
//

$startTime = microtime(true);

$array = array('ab', 'cd', 'ef', 'gh',
'ij', 'kl', 'mn', 'op',
'qr', 'st', 'uv', 'wx', 'yz');
for ( $i = 0; $i < 100000; $i++ ) {
if ( in_array($str, $array) ) {}
}

$endTime = microtime(true);

echo 'in_array() + $array<br />';
echo $endTime - $startTime . 'sec<br />';
?>

実験結果

preg_match()
0.393015146255sec
in_array()
0.468837022781sec
in_array() + $array
0.142140865326sec

結果からいけること

preg_matchのほうがin_arrayよりも高速だった点は意外でした。in_arrayがpreg_matchよりも遅延したのは候補の文字列の配列を毎回生成するためだったとかんがえられます。in_arrayでも候補文字列の配列を1度だけ生成し、かつ、その配列を再利用さえすれば、もっとも高速に処理できることが判明しました。
RELATED POSTS