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秒考えてやめた。
自分一人でゼロから作る場合ならやる。