Home > info > for で変換 vs ダンプした文字列を変換して eval

for で変換 vs ダンプした文字列を変換して eval

ふと、for で回してパラメーターの個数分変換するのと、Data::Dumper でダンプして1回だけ変換して eval するのとどっちが速いのか気になってベンチマーク取ってみました。

コードと結果は以下。

#!/usr/bin/perl
use strict;
use warnings;
use Benchmark ':all';
use Encode qw(encode decode);
use Data::Dumper;

$Data::Dumper::Terse = 1;

our $params = {
    user => 'ユーザー',
    pass => 'password',
    text => 'フォームパラメーターの変換テストです
             for でひとつずつ処理する方法と
             Data::Dumper と eval で一度に処理する方法と
             どちらが速いかテストします',
    jobs => [ qw(foo bar baz) ],
};

cmpthese(timethese(1_000_000, {
    'loop' => sub {
        my $params = $params;
        for my $value (values %$params) {
            next if (ref $value && ref $value ne 'ARRAY');
            for my $v (ref($value) ? @$value : $value) {
                $v = encode('euc-jp', decode('utf8', $v));
            }
        }
    },
    'dumper' => sub {
        my $params = $params;
        $params = eval encode('euc-jp', decode('utf8', Dumper $params));
    },
}));

結果はこちら。eval 入るからかやはり for の方が速かったです。YAML の loader() & dumper() も試しましたが、そっちはこの二つと比べ物にならない遅さでした。

Benchmark: timing 1000000 iterations of dumper, loop...
    dumper: 235 wallclock secs (233.67 usr +  0.18 sys = 233.85 CPU) @ 4276.25/s (n=1000000)
      loop: 154 wallclock secs (153.00 usr +  0.03 sys = 153.03 CPU) @ 6534.67/s (n=1000000)
         Rate dumper   loop
dumper 4276/s     --   -35%
loop   6535/s    53%     --

info ,

  1. コメントはまだありません。
  1. No trackbacks yet.