数字のみの郵便番号にハイフンを足すときは正規表現か否か

まあ、否なんですけど

単純な文字列操作に正規表現エンジンを立ち上げる必要は無い感じがプンプンするので、アレなんですが気まぐれに10万回転時のパフォーマンスを比べてみました。

function use_preg_replace($zip)
{
    return preg_replace('/^(\d{3})(\d{4})$/', '$1-$2', $zip);
}

function use_substr($zip)
{
    return substr($zip, 0, 3).'-'.substr($zip, 3);
}

// 10万回転ごとのタイムを溜める
$stack = array();

$t = new timer();

for ( $j = 0; $j < 10; $j++ ) {
    $t->start();
    for ( $i = 0; $i<100000; $i++ ) {
        use_substr('4870033');
    }
    $stack[] = $t->end();
}

var_dump(array_sum($stack) / count($stack));
var_dump($stack);

こんな感じで10万回転を10回繰り返して、各回の所用時間と、それらの平均をとってみました。くだんねー。

結果、substrのほうが40%高速

// preg_replaceをつかったとき
float(0.203863)
array(10) {
  [0]=> float(0.20533)
  [1]=> float(0.2094)
  [2]=> float(0.21387)
  [3]=> float(0.1964)
  [4]=> float(0.1946)
  [5]=> float(0.20371)
  [6]=> float(0.20579)
  [7]=> float(0.19904)
  [8]=> float(0.20849)
  [9]=> float(0.202)
}

// substrをつかったとき
float(0.12153)
array(10) {
  [0]=> float(0.12301)
  [1]=> float(0.12053)
  [2]=> float(0.12054)
  [3]=> float(0.11978)
  [4]=> float(0.12328)
  [5]=> float(0.12056)
  [6]=> float(0.11979)
  [7]=> float(0.12612)
  [8]=> float(0.12202)
  [9]=> float(0.11967)
}
preg_replace使用時
ave 0.203863s
substr使用時
ave 0.12153s

substrを使うほうが、およそ40%高速ですね! 正規表現のコストを意識するための戒めということで。単純な文字列操作・照合ぐらいなら正規表現なんて使わなくても何とかなることを忘れませんよーに!