文字列どもをぶった切る その2
前回Perlのバージョンが5.6だったため
動かなかった部分を
$cutting =~ s/(\p{Hiragana}|\p{Katakana})(\p{Han}|[A-Za-z0-9_])/$1,$2/g;
$cutting =~ s/(\p{Hiragana})(\p{Katakana})/$1,$2/g;
を修正して
$cutting = jcode($cutting)->euc;
$cutting =~ s/*1*2/$1,$2/g;
$cutting =~ s/(\xA4[\x00-\xFF]|\xA1\xBC)(\xA5[\x00-\xFF]|\xA1\xBC)/$1,$2/g;
$cutting = jcode($cutting)->utf8;
になりました
文字コードを一旦EUCに変換して正規表現処理
後にまた、UTF8に戻す という流れ。
というか、Text::BreakIterator の一部を流用しただけなんだが…
で、早速ベンチマークを取ってみる
unicodeによる正規表現 → 初回 約1.40秒、二回目 約1.43秒 、三回目 約1.40秒
euc変換しての正規表現 → 初回 約6.25秒、二回目 約6.28秒 、三回目 約6.25秒
……………orz
まさか性能に三倍以上の開きが出るとは…
これはコード変換に時間が掛かってるためだろうか…
そう思い
コード変換のところだけ外出しにして
再びベンチマークを取ってみる
unicodeによる正規表現 → 初回 約1.30秒、二回目 約1.32秒 、三回目 約1.32秒
euc変換しての正規表現 → 初回 約1.02秒、二回目 約1.05秒 、三回目 約1.04秒
おいおい追い抜いたよ…('A`)
結論
UTF8コード(エディタ)でPerlが書かれている場合
UTF8のエンコード/デコードは殆ど時間が掛からない
UTF8からEUCへの変換/EUCからUTF8変換は時間が掛かる
その差は10000回ぐらいの連続処理で実感ができる
(処理する文字数今回のこの文章全体ぐらいだと500回ぐらいで2秒程差が出る)
Unicode固有の正規表現\p{}は便利だが、
単純にEUCで文字コードの範囲指定を行うと\p{}はより早い。
あとはこれで、unicodeの文字コード範囲指定が解れば
正確な差が出てくるんですが…誰か知りませんか…(ぉ
前回に続いて、Perl使いからのツッコミ大歓迎。