注意
この記事は、正規表現が優れている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];に対象の値が入ってます。