#!/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,