内部文字列からUTF-8にするにはencode_utf8()を使う
あるいは、UTF-8のバイト文字列からフラグのついた内部文字列にするには、decode_utf8()を使う。
そのものっぽい名前だし。
普通のencode('utf8', $str)、decode('utf8', $str)よりも、処理速度がその方が早いようだ。
#!perl use strict; use warnings; use Benchmark qw/ cmpthese timethese /; use Encode qw/ decode decode_utf8 /; my $str = 'じゅげむじゅげむごこうのすりきれかいじゃりすいぎょのすいぎょうまつうんらいまつふうらいまつくうねるところにすむところやぶらこうじのぶらこうじぱいぽぱいぽのしゅうりんがんしゅうりんがんのぐうりんだいぐうりんだいのぽんぽこぴいのぽんぽこなあのちょうきゅうめいのちょうすけ'; cmpthese( timethese( 30_000, { decode => sub { decode('utf8', $str) }, decode_utf8 => sub { decode_utf8($str) }, } ) );
結果。
Benchmark: timing 300000 iterations of decode, decode_utf8... decode: 4 wallclock secs ( 3.53 usr + 0.00 sys = 3.53 CPU) @ 84955.75/s (n=300000) decode_utf8: 3 wallclock secs ( 3.06 usr + 0.00 sys = 3.06 CPU) @ 97959.18/s (n=300000) Rate decode decode_utf8 decode 84956/s -- -13% decode_utf8 97959/s 15% --
2010/10/27 8:00追記
iMacでの実行結果。Perl5.10.1。
Benchmark: timing 30000 iterations of decode, decode_utf8... decode: 0 wallclock secs ( 0.54 usr + 0.00 sys = 0.54 CPU) @ 55555.56/s (n=30000) decode_utf8: 1 wallclock secs ( 0.58 usr + 0.00 sys = 0.58 CPU) @ 51724.14/s (n=30000) Rate decode_utf8 decode decode_utf8 51724/s -- -7% decode 55556/s 7% --
開発サーバ。Perl5.12.2。CentOS。
Benchmark: timing 30000 iterations of decode, decode_utf8... decode: 0 wallclock secs ( 0.47 usr + 0.00 sys = 0.47 CPU) @ 63829.79/s (n=30000) decode_utf8: 0 wallclock secs ( 0.28 usr + 0.00 sys = 0.28 CPU) @ 107142.86/s (n=30000) (warning: too few iterations for a reliable count) Rate decode decode_utf8 decode 63830/s -- -40% decode_utf8 107143/s 68% --
うーん、ばらつきあるなあ。