エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

【PHP】正規表現vs複数関数 速度テストしてみた【40日目】

注意

この記事は、正規表現が優れているor優れていないを
ジャッジするため記事ではありません。

ただ、友人達とある問題を解決しようとして試行錯誤した記録です。
そしていつもより記事長いです。

発端は友人Aが実装案を求めた話

pathinfoで拡張子取ろうとした時に、 `hoge.tar.gz` だと `gz` だけ取れる問題
素敵な解決策ご存じの方居る?

『せいきひょうg(ry』
友人B

echo ltrim(strstr(basename(‘/root/my.folder/my.css’), ‘.’), ‘.’);

ほう・・・?これは正規表現が好き(だけど極力使わない)私への挑戦とみた。(違う)

まあ、普通にどっちが早いんだ?って思ったので試そうかって話を出したら盛り上がりました。

正規表現vs友人の関数重ね

preg_match('/.*\/.*?\.(.*)/', '/root/my.folder/my.tar.gz', $result);
$result = ltrim(strstr(basename(‘/root/my.folder/my.css’), ‘.’), ‘.’);

1000000回回すコード書いてみた

<?php
$func_method = function() {
    $result = ltrim(strstr(basename('root/my.folder/my.tar.gz'), '.'), '.');
};
$func_preg = function() {
    preg_match('/.*\/.*?\.(.*)/', '/root/my.folder/my.tar.gz', $result);
};
echo "複数関数:処理時間:" . measure($func_method) . "秒\n";
echo "正規表現:処理時間:" . measure($func_preg) . "秒\n";

function measure(\closure $f) {
    $s = microtime(true);
    for ($i = 0; $i < 1000000; $i++) {
        $f();
    }
    $e = microtime(true);

    return $e - $s;
}

実行結果

$ php pregVsMethod.php
複数関数:処理時間:0.41173195838928秒
正規表現:処理時間:0.58682203292847秒

感想

くそぅ|||orz
まあ正規表現は遅いとはよく聞いてたから予想はしてたけどさ|||orz

ちなみに、
『可読性・修正容易性にも関わる』 『プログラミングでは、書きやすさよりも読みやすさのほうが大事』
ってこともあり、正規表現は極力使わない方がいいと思ってます。

好きだけど!好きだけど!!!

謝辞

若手開発者コミュニティ Oystersのみんな hatenablog.com

今回のメンバー。 平日にこんな感じの雑談したり、休日に一緒に勉強会したりと、良い輪です。
私の思いつきにも応えてくれる仲間に感謝。

日記

ちなみに、その後どの複数関数が遅いのかをテストしましたが、
今ソースが再現できませんでした|||orz 今回のソースを途中までgithubに上げてるので、またいつか更新しておきますね。

こんな感じに、日記だけじゃなく、ソースコードで色々残したいところ。

面白いと思ったらぜひスターを(・∀・)! github.com

蛇足

preg_match('/.*\/.*?\.(.*)/', '/root/my.folder/my.tar.gz', $result);

ですが、$result[1];に対象の値が入ってます。