NeverBlog::Likk::Unexistable;

見なかったことにして下さい

文字列どもをぶった切る その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使いからのツッコミ大歓迎。

*1:?:\xA4[\x00-\xFF]|\xA1\xBC)|(?:\xA5[\x00-\xFF]|\xA1\xBC

*2:?:[\xB0-\xF4][\x00-\xFF])|(?:[\x21-\x7E]