日記+コメント付きブックマーク+他人にも役に立つかもしれない情報など。
(更新情報: RSS(ツッコミ付き) / RSS(ツッコミ抜き) / LIRS)
- p (01/03)
- Thiramil (10/26)
- 久々にいまむらを食べたい通りすがり (09/28)
- Fluxadir (05/16)
- Antiprestin (11/08)
2006/10/27
_ [Perl] Encode.pm, Jcode.pm, Text::Iconv のベンチマーク比較@Public Diary
Encode.pm Jcode.pm のベンチマーク比較@isoya9の日記
なるほど。
あと Unicode::Japanese と jcode.pl も加えて、自動検出の使用・不使用での差も見たいところですね。
_ [Perl] Encode, Text::Iconv, Unicode::Japanese, Jcode, jcode.pl のベンチマーク比較
というわけで、やってみました。
- 入力コードの自動判別機能を持つモジュールはそれを使った場合 (guess) と使わない場合 (fixed) 両方でテスト
- jcode.pl は型グロブ渡し (grob) 参照渡し (ref) 両方をテスト
- jcode.pl はキャッシュ使用 (cache) 不使用 (nocache) 両方をテスト
- jcode.pl は utf8 をサポートしてないため、sjis との変換で。ただし他のモジュールとの不公平が出ないよう、他のモジュールでは utf8 だけでなく sjis との変換もテスト。
- 実行環境は Pentium 4 3.06GHz マシン + Windows XP SP2 + coLinux 0.6.4 + Debian GNU/Linux 3.1 + Perl 5.8.4 (Encode 1.99 + Text::Iconv 1.2 + Unicode::Japanese 0.23 + Jcode.pm 0.88 + jcode.pl 2.13)
- Jcode と Unicode::Japanese は Debian パッケージの XS 版のほか、同バージョンの PP 版、最新の PP 版 (Jcode 2.06, Unicode::Japanese 0.38) でもテスト
使ったコード … jcodebench.pl
変換速度の比較
jcode::convert(guess-sjis-grob-nocache) 84746/s jcode::convert(guess-sjis-grob-cache) 84746/s jcode::convert(fixed-sjis-grob-nocache) 53763/s jcode::convert(fixed-sjis-grob-cache) 50505/sJcode::convert(fixed-utf8-xs088) 37594/s Text::Iconv(fixed-utf8) 36496/s Text::Iconv(fixed-sjis) 34722/s Encode::from_to(fixed-utf8) 31250/s Encode::from_to(fixed-sjis) 29070/s Jcode::convert(fixed-utf8-pp206) 21739/s Jcode::convert(fixed-sjis-pp206) 21739/s Unicode::Japanese::new(fixed-sjis-xs) 18868/s Unicode::Japanese::new(guess-sjis-xs) 16447/s jcode::convert(fixed-sjis-ref-cache) 12755/s Unicode::Japanese::new(fixed-utf8-xs) 12107/s jcode::convert(fixed-sjis-ref-nocache) 11737/s Unicode::Japanese::new(guess-utf8-xs) 10941/s Jcode::convert(fixed-sjis-pp088) 10121/s Jcode::convert(fixed-sjis-xs088) 10081/s jcode::convert(guess-sjis-ref-nocache) 6676/s jcode::convert(guess-sjis-ref-cache) 6274/s Jcode::convert(guess-sjis-pp206) 5945/s Jcode::convert(guess-utf8-xs088) 5507/s Encode::from_to(guess-utf8) 5359/s Jcode::new(guess-sjis-pp206) 5336/s Encode::from_to(guess-sjis) 5297/s Jcode::new(guess-utf8-xs088) 5056/s Jcode::convert(guess-utf8-pp206) 5035/s Jcode::convert(guess-sjis-xs088) 4608/s Jcode::convert(guess-sjis-pp088) 4608/s Jcode::new(guess-utf8-pp206) 4583/s Unicode::Japanese::new(fixed-utf8-pp038) 4230/s Jcode::new(guess-sjis-pp088) 4205/s Jcode::new(guess-sjis-xs088) 4191/s Jcode::convert(fixed-utf8-pp088) 3751/s Unicode::Japanese::new(fixed-utf8-pp023) 3613/s Unicode::Japanese::new(fixed-sjis-pp038) 3544/s Unicode::Japanese::new(fixed-sjis-pp023) 2831/s Jcode::convert(guess-utf8-pp088) 2374/s Jcode::new(guess-utf8-pp088) 2255/s Unicode::Japanese::new(guess-utf8-pp038) 2199/s Unicode::Japanese::new(guess-sjis-pp038) 2056/s Unicode::Japanese::new(guess-utf8-pp023) 1910/s Unicode::Japanese::new(guess-sjis-pp023) 1707/s
変換速度についての考察
- Encode, Jcode, jcode.pl (参照渡し) では、文字コードを自動判別させるとかなり遅くなるが、Unicode::Japanese は変わらない。
jcode.pl (型グロブ渡し) はなぜか自動判別させた方が速くなる? (んなアホな…) 特に型グロブ渡しの jcode.pl が異常に速い (jcode.pl の私的な解説書 によれば「perl5 のリファレンスの方が、perl4 の型グロブ形式よりも高速です。」となっているのだが…) 何かの間違いではないのか?→ 何かの間違いでした。詳しくは文字コード > jocode.pl, Jcode.pm, Encode.pmのパフォーマンス比較/一番速いのはどれ?を参照ください。- Jcode の入力コード自動判別は XS の有無に関わらず遅い
- 入力コードの自動判別をしなければ、Jcode.pm 2.0 以降は「Jcode 2.0 より、お使いの Perl Version が 5.8.1 以降の場合は Encode の Wrapper として機能するようになりました。」というだけあって、XS が使えなくてもかなりいける
- XS が使えない場合 Unicode::Japanese はあらゆる面で最弱
- Jcode 0.88 も XS が使えない場合は Unicode::Japanese に肉薄する遅さ
モジュールのロード速度の比較 (Public Diary 同様に100回繰り返しの測定)
jcode.pl real 2.073s user 1.390s sys 0.690s Text::Iconv real 3.336s user 1.840s sys 1.480s Jcode (XS 0.88) real 3.923s user 2.670s sys 1.240s Jcode (PP 0.88) real 3.939s user 2.740s sys 1.200s Encode real 4.244s user 2.030s sys 2.210s Unicode::Japanese (PP 0.23) real 4.919s user 2.590s sys 2.320s Unicode::Japanese (XS 0.23) real 4.930s user 2.940s sys 1.980s Unicode::Japanese (PP 0.38) real 4.977s user 2.730s sys 2.240s Encode + Encode::Guess real 5.137s user 2.660s sys 2.480s Jcode (PP 2.06) real 10.658s user 6.420s sys 4.230s
モジュールロード時間の考察
- 入力コードの自動判別が不要なら Text::Iconv が最速
- 入力コードの自動判別が必要なら Jcode 0.88 が最速
- Jcode, Unicode::Japanese ともに XS 版と PP 版でロード時間の差は見受けられない
- Jcode 2.06 のロード時間が目立って遅い
- …どれも0.1ミリ秒以下だし、そもそもロード時間なんかどうでもいいという噂も
どのモジュールを選ぶのが良いのか (速度的な面から)
- 入力コードの自動判別が不要なら Text::Iconv が最速 (でも Text::Iconv と Encode との差は僅かだから、Encode でいいんじゃね? 標準モジュールだし)
- 入力コードの自動判別が必要なら Unicode::Japanese (XS) が最速
- Jcode は遅いので、以下の2つのケースを除いて使うメリット無し
- Perl 5.8.0 以前で、XS が使えない場合は Jcode が有用
- Perl 5.8.1 以降で、XS が使えず文字コード自動判別が必要な場合は Jcode が若干有用 (ただしこれも Encode::Guess との差は極僅か。…でも Encode::Guess 使いづらいし)
ということになるのでしょうか。
使い勝手とか判別精度とか無視してるので、速度だけで決めることはできないですが。
まああと
- それぞれ自動判別の精度やクセ・不具合は?
- もっと長大な文字列を与えた場合は?
といった点について考慮する必要がありそうです。
個人的には Unicode::Japanese の隠しメソッドが魅力的なので Unicode::Japanese が基本になりつつあります。
(追記) 「Unicode::Japanese は全角半角変換させると遅いょ」という話があったのでメモ。でも Encode::JP::H2Z は内部処理が EUC-JP で行われてるのが嫌げです。
(追記) jcode.pl の型グロブ渡しは実際には何もしてないから爆速で当然だよというツッコミがあったので修正。