use 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->();
}
small and smallx win
{
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
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. |