in reply to Temp variable performace vs Inline behavior
small and smallx winuse strict; use Data::Dumper; use Devel::Peek; use B::Deparse; use B::Concise; use Devel::Size qw(size total_size); sub big { my (@nodes, @device); foreach (@nodes) { my $tdev = parse_node($_); push (@device, $tdev) if defined($tdev); } } sub medium { my (@nodes, @device); foreach (@nodes) { push (@device, parse_node($_)) if defined(parse_node($_)); } } sub small { my (@nodes, @device, $result); foreach (@nodes) { push (@device, $result) if defined($result = parse_node($_)); } } sub smallx { my (@nodes, @device, $result); foreach (@nodes) { defined($result = parse_node($_)) ? push (@device, $result): 0 +; } } sub notsmall { my (@nodes, @device); foreach (@nodes) { push (@device, $_) if defined($_ = parse_node($_)); } } foreach (\&big, \&medium, \&small, \&smallx, \¬small) {DumpStats($_ +);} sub DumpStats { my $deparse = B::Deparse->new(); print $deparse->coderef2text($_[0]); print "\n\n".size($_[0])."\n\n"; my $walker = B::Concise::compile('-src','-exec',$_[0]); $walker->(); }
My Devel::Size is not the stock CPAN Devel::Size, so my numbers are much lower than the CPAN version but relative to each other they should be fine. Getting rid of the nextstate op for the block of the foreach loop interestingly did not decrease the size the ::Size reported, IDK why. I know that the nextstate ops do execute if I step through runops in C.{ use strict 'refs'; my(@nodes, @device); foreach $_ (@nodes) { my $tdev = parse_node($_); push @device, $tdev if defined $tdev; } } 1349 B::Concise::compile(CODE(0x829fac)) # 9: my (@nodes, @device); 1 <;> nextstate(main -4 n13.pl:9) v:*,&,$ 2 <0> pushmark vM/128 3 <0> padav[@nodes:-4,0] vM/LVINTRO 4 <0> padav[@device:-4,0] vM/LVINTRO 5 <@> list vKPM/128 # 10: foreach (@nodes) { 6 <;> nextstate(main -1 n13.pl:10) v:*,&,{,$ 7 <0> pushmark sM 8 <0> padav[@nodes:-4,0] sRM 9 <#> gv[*_] s a <{> enteriter(next->q last->t redo->b) lKS/8 r <0> iter s s <|> and(other->b) K/1 # 11: my $tdev = parse_node($_); b <;> nextstate(main -3 n13.pl:11) v:*,&,{,$ c <0> pushmark s d <#> gvsv[*_] s e <#> gv[*parse_node] s/EARLYCV f <1> entersub[t7] sKS/TARG,3 g <0> padsv[$tdev:-3,-2] sRM*/LVINTRO h <2> sassign vKS/2 # 12: push (@device, $tdev) if defined($tdev); i <;> nextstate(main -2 n13.pl:12) v:*,&,{,$ j <0> padsv[$tdev:-3,-2] s k <1> defined sK/1 l <|> and(other->m) vK/1 m <0> pushmark s n <0> padav[@device:-4,0] lRM o <0> padsv[$tdev:-3,-2] l p <@> push[t8] vK/2 q <0> unstack s goto r t <2> leaveloop K/2 u <1> leavesub[1 ref] K/REFC,1 { use strict 'refs'; my(@nodes, @device); foreach $_ (@nodes) { push @device, parse_node($_) if defined parse_node($_); } } 1320 B::Concise::compile(CODE(0xc3020c)) # 17: my (@nodes, @device); v <;> nextstate(main 1 n13.pl:17) v:*,&,$ w <0> pushmark vM/128 x <0> padav[@nodes:1,4] vM/LVINTRO y <0> padav[@device:1,4] vM/LVINTRO z <@> list vKPM/128 # 18: foreach (@nodes) { 10 <;> nextstate(main 3 n13.pl:18) v:*,&,{,$ 11 <0> pushmark sM 12 <0> padav[@nodes:1,4] sRM 13 <#> gv[*_] s 14 <{> enteriter(next->1j last->1m redo->15) lKS/8 1k <0> iter s 1l <|> and(other->15) K/1 # 19: push (@device, parse_node($_)) if defined(parse_node($_) +); 15 <;> nextstate(main 2 n13.pl:19) v:*,&,{,$ 16 <0> pushmark s 17 <#> gvsv[*_] s 18 <#> gv[*parse_node] s/EARLYCV 19 <1> entersub[t11] sKS/TARG,3 1a <1> defined sK/1 1b <|> and(other->1c) vK/1 1c <0> pushmark s 1d <0> padav[@device:1,4] lRM 1e <0> pushmark s 1f <#> gvsv[*_] s 1g <#> gv[*parse_node] s/EARLYCV 1h <1> entersub[t6] lKS/TARG,3 1i <@> push[t7] vK/2 1j <0> unstack s goto 1k 1m <2> leaveloop K/2 1n <1> leavesub[1 ref] K/REFC,1 { use strict 'refs'; my(@nodes, @device, $result); foreach $_ (@nodes) { push @device, $result if defined($result = parse_node($_)); } } 1291 B::Concise::compile(CODE(0xbbdd24)) # 24: my (@nodes, @device, $result); 1o <;> nextstate(main 5 n13.pl:24) v:*,&,$ 1p <0> pushmark vM/128 1q <0> padav[@nodes:5,8] vM/LVINTRO 1r <0> padav[@device:5,8] vM/LVINTRO 1s <0> padsv[$result:5,8] vM/LVINTRO 1t <@> list vKPM/128 # 25: foreach (@nodes) { 1u <;> nextstate(main 7 n13.pl:25) v:*,&,{,$ 1v <0> pushmark sM 1w <0> padav[@nodes:5,8] sRM 1x <#> gv[*_] s 1y <{> enteriter(next->2c last->2f redo->1z) lKS/8 2d <0> iter s 2e <|> and(other->1z) K/1 # 26: push (@device, $result) if defined($result = parse_node( +$_)); 1z <;> nextstate(main 6 n13.pl:26) v:*,&,{,$ 20 <0> pushmark s 21 <#> gvsv[*_] s 22 <#> gv[*parse_node] s/EARLYCV 23 <1> entersub[t8] sKS/TARG,3 24 <0> padsv[$result:5,8] sRM* 25 <2> sassign sKS/2 26 <1> defined sK/1 27 <|> and(other->28) vK/1 28 <0> pushmark s 29 <0> padav[@device:5,8] lRM 2a <0> padsv[$result:5,8] l 2b <@> push[t4] vK/2 2c <0> unstack s goto 2d 2f <2> leaveloop K/2 2g <1> leavesub[1 ref] K/REFC,1 { use strict 'refs'; my(@nodes, @device, $result); foreach $_ (@nodes) { defined($result = parse_node($_)) ? push(@device, $result) : ' +???'; } } 1292 B::Concise::compile(CODE(0xc00454)) # 31: my (@nodes, @device, $result); 2h <;> nextstate(main 9 n13.pl:31) v:*,&,$ 2i <0> pushmark vM/128 2j <0> padav[@nodes:9,12] vM/LVINTRO 2k <0> padav[@device:9,12] vM/LVINTRO 2l <0> padsv[$result:9,12] vM/LVINTRO 2m <@> list vKPM/128 # 32: foreach (@nodes) { 2n <;> nextstate(main 11 n13.pl:32) v:*,&,{,$ 2o <0> pushmark sM 2p <0> padav[@nodes:9,12] sRM 2q <#> gv[*_] s 2r <{> enteriter(next->35 last->38 redo->2s) lKS/8 36 <0> iter s 37 <|> and(other->2s) K/1 # 33: defined($result = parse_node($_)) ? push (@device, $resu +lt): 0; 2s <;> nextstate(main 10 n13.pl:33) v:*,&,{,$ 2t <0> pushmark s 2u <#> gvsv[*_] s 2v <#> gv[*parse_node] s/EARLYCV 2w <1> entersub[t7] sKS/TARG,3 2x <0> padsv[$result:9,12] sRM* 2y <2> sassign sKS/2 2z <1> defined sK/1 30 <|> cond_expr(other->31) vK/1 31 <0> pushmark s 32 <0> padav[@device:9,12] lRM 33 <0> padsv[$result:9,12] l 34 <@> push[t8] vK/2 35 <0> unstack s goto 36 38 <2> leaveloop K/2 39 <1> leavesub[1 ref] K/REFC,1 { use strict 'refs'; my(@nodes, @device); foreach $_ (@nodes) { push @device, $_ if defined($_ = parse_node($_)); } } 1330 B::Concise::compile(CODE(0xc00324)) # 37: my (@nodes, @device); 3a <;> nextstate(main 13 n13.pl:37) v:*,&,$ 3b <0> pushmark vM/128 3c <0> padav[@nodes:13,16] vM/LVINTRO 3d <0> padav[@device:13,16] vM/LVINTRO 3e <@> list vKPM/128 # 38: foreach (@nodes) { 3f <;> nextstate(main 15 n13.pl:38) v:*,&,{,$ 3g <0> pushmark sM 3h <0> padav[@nodes:13,16] sRM 3i <#> gv[*_] s 3j <{> enteriter(next->3x last->40 redo->3k) lKS/8 3y <0> iter s 3z <|> and(other->3k) K/1 # 39: push (@device, $_) if defined($_ = parse_node($_)); 3k <;> nextstate(main 14 n13.pl:39) v:*,&,{,$ 3l <0> pushmark s 3m <#> gvsv[*_] s 3n <#> gv[*parse_node] s/EARLYCV 3o <1> entersub[t9] sKS/TARG,3 3p <#> gvsv[*_] s 3q <2> sassign sKS/2 3r <1> defined sK/1 3s <|> and(other->3t) vK/1 3t <0> pushmark s 3u <0> padav[@device:13,16] lRM 3v <#> gvsv[*_] s 3w <@> push[t4] vK/2 3x <0> unstack s goto 3y 40 <2> leaveloop K/2 41 <1> leavesub[1 ref] K/REFC,1
|
|---|