- 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に組み込んでみよう(笑)