#!/usr/bin/perl
use warnings;
use strict;
use Syntax::Construct qw( // );
use Benchmark qw{ cmpthese };
use List::Util qw{ first };
use Test::More;
sub f0 {
my ($arg) = grep length, shift, 'default';
$arg
}
sub f1 {
my $arg = first { defined && length } shift, 'default';
$arg
}
sub f2 {
my $arg = defined $_[0] && length $_[0] ? shift : 'default';
$arg
}
our @args = ( undef, '', 'fred', 1, 1.5 ) x 1000;
for my $arg (@args[ 0 .. 4 ]) {
is f0($arg), f1($arg), "f0-f1-" . ($arg // 'undef');
is f0($arg), f2($arg), "f0-f2-" . ($arg // 'undef');
}
done_testing();
cmpthese -1, {
grep => q[ f0( $_ ) for @args ],
first => q[ f1( $_ ) for @args ],
simple => q[ f2( $_ ) for @args ],
};
####
ok 1 - f0-f1-undef
ok 2 - f0-f2-undef
ok 3 - f0-f1-
ok 4 - f0-f2-
ok 5 - f0-f1-fred
ok 6 - f0-f2-fred
ok 7 - f0-f1-1
ok 8 - f0-f2-1
ok 9 - f0-f1-1.5
ok 10 - f0-f2-1.5
1..10
Rate first grep simple
first 570/s -- -14% -45%
grep 661/s 16% -- -36%
simple 1036/s 82% 57% --
####
($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord
}map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,