Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

内部文字列から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%          --


うーん、ばらつきあるなあ。