grep => sub {
while ( $data =~ /^(\d+) (\d+)/mg ) {
next if grep { $1 eq $_ } @skip;
next if grep { $2 eq $_ } @skip;
}
return 1
},
grep_1 => sub {
while ( $data =~ /^(\d+) (\d+)/mg ) {
next if grep { 1; $1 eq $_ } @skip;
next if grep { 1; $2 eq $_ } @skip;
}
return 1
},
grep_1 316/s -- -61%
grep 811/s 156% --
Writing as "answer" to self, because I really don't want to ping anyone, moreover request explanation; these tests are becoming stupid in addition to idle. Apparently "grep" is capable to optimise its braces (block) away (sometimes. Though not in case of e.g. grep { /x/ } @a, but that's digression):
perl -MO=Concise,-exec -e "grep { $1 eq $_ } @a"
1 <0> enter v
2 <;> nextstate(main 1 -e:1) v:{
3 <0> pushmark s
4 <#> gv[*a] s
5 <1> rv2av[t4] lKM/1
6 <@> grepstart K
7 <|> grepwhile(other->8)[t5] vK
8 <#> gvsv[*1] s
9 <#> gvsv[*_] s
a <2> seq sK/2
goto 7
b <@> leave[1 ref] vKP/REFC
same output without a block i.e. for grep $1 eq $_, @a. But:
perl -MO=Concise,-exec -e "grep { 1; $1 eq $_ } @a"
1 <0> enter v
2 <;> nextstate(main 1 -e:1) v:{
3 <0> pushmark s
4 <#> gv[*a] s
5 <1> rv2av[t4] lKM/1
6 <@> grepstart K
7 <|> grepwhile(other->8)[t5] vK
8 <0> enter s
9 <;> nextstate(main 2 -e:1) v
a <#> gvsv[*1] s
b <#> gvsv[*_] s
c <2> seq sK/2
d <@> leave sKP
goto 7
e <@> leave[1 ref] vKP/REFC
And so grep's not-really-anon-sub-but-something-else, even if it doesn't capture outside vars here, is significantly slower than any's real-anon-sub when it doesn't capture vars too, and actually as slow as the latter when it captures vars.