2007/04/26(木)perl の Encode で find_encode は使えるのか?
perl tips - Encodeを速く使う方法によると、find_encoding を使うと、Encode による文字変換が早くなるらしいということで実験してみました。
実験条件
- use utf8 しない(use utf8 はトラブルが多すぎてやってられないので)。
- 変換前も変換後も utf8 フラグは立っていないこと。
- 実験用データとして、42KBのテキストファイル(EUC-JP, 日本語半分ぐらい)を用意。
ソースはこんな感じです。引数に処理したい euc-jp のテキストファイル名を与えます。
use strict;
use Benchmark;
use Encode;
use Encode::Guess qw(euc-jp shiftjis iso-2022-jp);
my $euc = join('', <>);
my $utf = $euc;
Encode::from_to($utf, "euc-jp", "utf8");
my $euc_obj = find_encoding('euc-jp');
my $utf_obj = find_encoding('utf8');
my %test;
$test{fromto_u2e} = sub {
my $x = $utf;
Encode::from_to($x, "utf8", "euc-jp");
};
$test{fromto_e2u} = sub {
my $x = $euc;
Encode::from_to($x, "euc-jp", "utf8");
};
$test{find1_u2e} = sub {
my $x = $euc_obj->encode( $utf_obj->decode($utf) );
};
$test{find1_e2u} = sub {
my $x = $utf_obj->encode( $euc_obj->decode($euc) );
};
$test{find2_u2e} = sub {
my $x = $utf;
Encode::_utf8_on($x);
$x = $euc_obj->encode( $x );
};
$test{find2_e2u} = sub {
my $x = $euc_obj->decode($euc);
Encode::_utf8_off($x);
};
$test{encode_u2e} = sub {
my $x = $utf;
Encode::_utf8_on($x);
$x = encode('euc-jp', $x);
print $x;
};
$test{decode_e2u} = sub {
my $x = decode('euc-jp', $euc);
Encode::_utf8_off($x);
};
timethese(1000,\%test);
結果は次のとおりになりました。
| 方式 | utf8 to euc | euc to utf8 |
|---|---|---|
| from_to | 100.26/s | 336.84/s |
| find_encoding | 103.92/s | 380.20/s |
| find_encoding + _utf_on/off | 357.21/s | 397.93/s |
| encode/decode | 304.76/s | 350.68/s |
utf8からutf8(フラグ付き)への変換=utf8文字列の検証が入らないので速くなりましたが、ほかは大して変わりません。use utf8 しない環境では find_encodeを使うほどでもないなぁーという感じもします。
つまり、utf8を他の文字コードに変換する場合は、Encode::_utf8_on() + encode を使うと速い。短い文字列を多量に処理するのでなければ、ほかは大して変わらない。ということだと思います。
というわけで
早速adiaryに組み込んでみよう(笑)