パルカワ2

最近はFlutterをやっています

ハッシュっぽい配列からkeysだけ取り出したい

use 5.012;
use strict;
use warnings;
use Benchmark qw(:all);

bench($_) for qw(10 100 1000 10000);

sub bench {
    my ($max) = @_;
    my @vars = map {$_ => $_} 1..$max;

    say $max;
    cmpthese -1 => {
        'no copy' => sub{
            my @keys = map { $_%2 ? () : $vars[$_] } keys @vars;
        },
        'copy' => sub{
            my @keys;
            my @vars_copy = @vars;
            while (my ($key) = splice @vars_copy, 0,2) {
                push @keys, $key;
            }
        },
        'lestrrat-san' => sub {
            my @keys;
            for my $i (0..$#vars/2) {
                push @keys, $vars[$i * 2];
            }
        },
        'tokuhirom-san' => sub {
            my @keys;
            for (my $i=0;$i<@vars;$i+=2) {
                push @keys, $vars[$i];
            }
        },
    };
}

$ perl test.pl 
10
                  Rate       no copy          copy tokuhirom-san  lestrrat-san
no copy       204799/s            --           -7%          -35%          -42%
copy          219429/s            7%            --          -31%          -38%
tokuhirom-san 317021/s           55%           44%            --          -11%
lestrrat-san  355071/s           73%           62%           12%            --
100
                 Rate       no copy          copy tokuhirom-san  lestrrat-san
no copy       18589/s            --          -14%          -34%          -54%
copy          21525/s           16%            --          -23%          -46%
tokuhirom-san 28128/s           51%           31%            --          -30%
lestrrat-san  40194/s          116%           87%           43%            --
1000
                Rate       no copy          copy tokuhirom-san  lestrrat-san
no copy       1691/s            --          -14%          -41%          -59%
copy          1976/s           17%            --          -31%          -52%
tokuhirom-san 2871/s           70%           45%            --          -30%
lestrrat-san  4095/s          142%          107%           43%            --
10000
               Rate       no copy          copy tokuhirom-san  lestrrat-san
no copy       117/s            --          -31%          -65%          -71%
copy          170/s           46%            --          -49%          -57%
tokuhirom-san 335/s          187%           97%            --          -16%
lestrrat-san  398/s          241%          134%           19%            --

ツッコミお待ちしております。

・追記1
ツッコミもらったので"lestrrat-san"を追加しました。ありがとうございます!

・追記2
ツッコミもらったので"tokuhirom-san"を追加しました。ありがとうございます!