sub mem { print "$_[0]:\n"; system "/bin/ps", "-osize,vsize", $$; } my @a; my %tests = ( # immediate data - no references iter_flat => sub { my $n = shift; push @a, $_*42 for 1..$n; }, func_flat => sub { my $n = shift; @a = map $_*42, 1..$n; }, # indirect/referenced data iter_ref => sub { my $n = shift; push @a, [ $_*42 ] for 1..$n; }, func_ref => sub { my $n = shift; @a = map [ $_*42 ], 1..$n; } ); my $what = shift @ARGV; my $n = shift @ARGV || 10_000_000; mem("before"); $tests{$what}->($n); mem("after"); #### $ ./883539.pl iter_flat before: SZ VSZ 608 22032 after: SZ VSZ 395196 416620 $ ./883539.pl func_flat before: SZ VSZ 608 22032 after: SZ VSZ 1390892 1412316 # map needs 3.5 times as much $ ./883539.pl iter_ref before: SZ VSZ 608 22032 after: SZ VSZ 1547832 1569256 $ ./883539.pl func_ref before: SZ VSZ 608 22032 after: SZ VSZ 2571632 2593056 # map needs 1.7 times as much