だるろぐ

だるいぶろぐです

encode/decode より find_encoding のが速いのは知ってたけどここまでか

今更ネタが続く。

くりかえしdecode()とencode()する場合には、OOインターフェースを使った方が高速です。なぜなら(de|en)codeが文字コード名を解決する手間がなくなるからです。
404 Blog Not Found:perl - Encode 入門

と言われているのは知ってたけど実際は毎回 decode('euc-jp', $str) とかしてて実際どんくらい違うのかなーとふと思って

use strict;
use warnings;
use Benchmark qw/:all/;
use Encode qw/find_encoding encode decode/;

my $euc = find_encoding('euc-jp');
my $utf = find_encoding('utf-8');

open my $fh, "<", "euc.txt";
my @txt;
for my $in (<$fh>) {
    push @txt, $in;
}
close $fh;

open my $normal, ">>", "normal.out";
open my $name,   ">>", "name.out";

cmpthese(
    timethese(0, {
        normal => sub {normal()},
        name   => sub {name()},
    })
);

sub normal {
    my $out;
    for my $in (@txt) {
        $out = decode('euc-jp', $in);
        $out = encode('utf-8',  $out);
        print $normal $out;
    }
}

sub name {
    my $out;
    for my $in (@txt) {
        $out = $euc->decode($in);
        $out = $utf->encode($out);
        print $name $out;
    }
}
% perl encode.pl
Benchmark: running name, normal for at least 3 CPU seconds...
      name:  3 wallclock secs ( 2.97 usr +  0.03 sys =  3.00 CPU) @ 11600.33/s (n=34801)
    normal:  4 wallclock secs ( 3.22 usr +  0.00 sys =  3.22 CPU) @ 1641.61/s (n=5286)
          Rate normal   name
normal  1642/s     --   -86%
name   11600/s   607%     --


とか凄まじい結果になったのでこれからはour変数にfind_encoding持ってアプリ全体で使いまわそうかなと思ったけど
2秒考えてやめた。
自分一人でゼロから作る場合ならやる。