y は,速いよ

こんな感じのコードを見たので,
やっぱy/// じゃね?と思ってベンチしてみた.

$count = $str =~ s/(\w)/$1/g;

結論的には,y/// の方がs/// や m// と対称性があって良いような気がする.ってことかな?
あと,1バイト削れるしね.ゴルファーも安心.
ということで,y をもっと使おう.

debian$ perl ./y_s_m.pl
      Rate     m     s     y   y_f
m    271/s    --   -9%  -78%  -95%
s    297/s    9%    --  -76%  -94%
y   1259/s  364%  325%    --  -77%
y_f 5376/s 1883% 1713%  327%    --
debian$ perl -v|egrep perl,
This is perl, v5.10.0 built for i486-linux-gnu-thread-multi
#!/usr/bin/env perl

use strict;
use warnings;
use utf8;

use Benchmark qw(cmpthese);

my $count = 5_000;
my $size = 100;
my $str = q{awWwWz} x $size;
my $re = q{wWwW};

my $y_f = eval qq|sub {\$_[0]=~y/$re//}|;

cmpthese($count, {
    s => sub {
        my $count = $str =~ s/([$re])/$1/g;
	die unless ($count == $size * 4);
    },
    m => sub {
        my $count = (@_ = $str =~ m/[$re]/g);
	die unless ($count == $size * 4);
    },
    y => sub {
        my $count = eval qq|\$str =~ y/$re//|;
	die unless ($count == $size * 4);
    },
    y_f => sub {
        my $count = $y_f->($str);
	die unless ($count == $size * 4);
    },
});