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");