スペースモラトリアムノカミサマ

日記+コメント付きブックマーク+他人にも役に立つかもしれない情報など。
(更新情報: RSS(ツッコミ付き) / RSS(ツッコミ抜き) / LIRS)

最近のツッコミ:
  1. p (07/15)
最近の TrackBack:
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|06|07|08|09|10|
2011|01|02|03|07|10|11|
2012|02|03|04|07|08|09|
2013|01|06|07|
2014|02|08|09|11|
2015|09|
2016|01|05|
2017|07|
2018|05|07|
2019|07|

2006/10/27

_ [Perl] Encode.pm, Jcode.pm, Text::Iconv のベンチマーク比較@Public Diary

Encode.pm Jcode.pm のベンチマーク比較@isoya9の日記

なるほど。

あと Unicode::Japanesejcode.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/s
Jcode::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

変換速度についての考察

モジュールのロード速度の比較 (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 の型グロブ渡しは実際には何もしてないから爆速で当然だよというツッコミがあったので修正。