2006年9月27日水曜日

[Perl] Encode.pm Jcode.pm のベンチマーク比較

まるごとPerl! Vol.1に Encode.pm が
特集されていましたが、今までなぜが Jcode.pm ばかり使ってました。
この機会に Encode.pm に切り替えようと思ったのですが、Jcode.pm と
どのくらい性能差があるか気になったのでベンチしてみました。

シナリオ
「漢字、カタカナ、ひらがなの混じったtext」に対して
・Jcode->new で euc/utf8 相互変換
・Jcode::convert で euc/utf8 相互変換
・Encode.pm で euc/utf8 相互変換

ソースコード
use strict;
use warnings;
use Benchmark ':all';
use Jcode;
use Encode;
my $text = qq{漢字、カタカナ、ひらがなの混じったtext};

cmpthese(
timethese(
10000,
{
Jcode => sub {
# euc => utf8
$text = Jcode->new($text)->utf8;
# utf8 => euc
$text = Jcode->new($text)->euc;
},
Convert => sub {
# euc => utf8
Jcode::convert( \$text, 'utf8', 'euc' );
# utf8 => euc
Jcode::convert( \$text, 'euc', 'utf8' );
},
Encode => sub {
# euc => utf8
Encode::from_to($text, "euc-jp", "utf-8");
# utf8 => euc
Encode::from_to($text, "utf-8", "euc-jp");
},
}
)
);

結果
Benchmark: timing 10000 iterations of Convert, Encode, Jcode...
Convert: 0 wallclock secs ( 0.75 usr + 0.00 sys = 0.75 CPU) @ 13333.33/s (n=10000)
Encode: 0 wallclock secs ( 0.54 usr + 0.00 sys = 0.54 CPU) @ 18518.52/s (n=10000)
Jcode: 3 wallclock secs ( 3.20 usr + 0.00 sys = 3.20 CPU) @ 3125.00/s (n=10000)
Rate Jcode Convert Encode
Jcode 3125/s -- -77% -83%
Convert 13333/s 327% -- -28%
Encode 18519/s 493% 39% --

さすが、Encode.pm が TOP でした。
Jcode->new が恐ろしく遅いです。
��変換前のコード検出処理の影響と思われます)
また、Jcode->new は変換漏れなんかがたまにあるので
Encode.pm が無い環境であれば、Jcode::convert 使いましょう。

2 件のコメント:

太鉄 さんのコメント...

Jcode => sub {
# euc => utf8
$text = Jcode->new($text,'euc')->utf8;
# utf8 => euc
$text = Jcode->new($text,'utf8')->euc;
},
とすればここまで差はつかないですね。

isoya9 さんのコメント...

そうですね。
変換前の文字コードを指定すれば、自動検出のコストが省けるので差が縮まると思います。