#! perl -sw use vars '$size $cpu'; use strict; use Benchmark 'cmpthese'; $::size ||= 1000; $::cpu ||= 1; my @empty; my @prealloc; $#prealloc = $::size; cmpthese( -$::cpu, { push => 'push @empty, q{data} for 0 .. $::size-1', assign => '$empty[$_] = q{data} for 0 .. $::size-1', assignpre => '$prealloc[$_] = q{data} for 0 .. $::size-1', slice => '@empty[0 .. $::size-1] = (q{data} x $::size)', slicepre => '@prealloc[0 .. $::size-1] = (q{data} x $::size)', }); cmpthese( -1, { push => 'push @empty, rand $::size for 0 .. $::size-1', assign => '$empty[$_] = rand $::size for 0 .. $::size-1', assignpre => '$prealloc[$_] = rand $::size for 0 .. $::size-1', slice => '@empty[0 .. $::size-1] = (map{rand $::size}1 .. $::size)', slicepre => '@prealloc[0 .. $::size-1] = (map{rand $::size}1..$::size)', }); __END__ C:\test>arraybench -size=10000 -cpu=1 Benchmark: running assign, assignpre, push, slice, slicepre, each for at least 1 CPU seconds... assign: 2 wallclock secs ( 1.01 usr + 0.00 sys = 1.01 CPU) @ 18.77/s (n=19) assignpre: 1 wallclock secs ( 1.01 usr + 0.00 sys = 1.01 CPU) @ 18.77/s (n=19) push: 1 wallclock secs ( 1.05 usr + 0.05 sys = 1.10 CPU) @ 13.61/s (n=15) slice: 2 wallclock secs ( 1.10 usr + 0.00 sys = 1.10 CPU) @ 26.32/s (n=29) slicepre: 1 wallclock secs ( 1.15 usr + 0.00 sys = 1.15 CPU) @ 26.04/s (n=30) Rate push assign assignpre slicepre slice push 13.6/s -- -28% -28% -48% -48% assign 18.8/s 38% -- -0% -28% -29% assignpre 18.8/s 38% 0% -- -28% -29% slicepre 26.0/s 91% 39% 39% -- -1% slice 26.3/s 93% 40% 40% 1% -- Benchmark: running assign, assignpre, push, slice, slicepre, each for at least 1 CPU seconds... assign: 1 wallclock secs ( 1.06 usr + 0.00 sys = 1.06 CPU) @ 20.74/s (n=22) assignpre: 1 wallclock secs ( 1.15 usr + 0.00 sys = 1.15 CPU) @ 20.85/s (n=24) push: 1 wallclock secs ( 0.98 usr + 0.03 sys = 1.01 CPU) @ 15.83/s (n=16) slice: 1 wallclock secs ( 1.00 usr + 0.00 sys = 1.00 CPU) @ 6.99/s (n=7) slicepre: 1 wallclock secs ( 1.13 usr + 0.00 sys = 1.13 CPU) @ 7.07/s (n=8) Rate slice slicepre push assign assignpre slice 6.99/s -- -1% -56% -66% -66% slicepre 7.07/s 1% -- -55% -66% -66% push 15.8/s 127% 124% -- -24% -24% assign 20.7/s 197% 193% 31% -- -1% assignpre 20.9/s 198% 195% 32% 1% -- C:\test>