# Benchmark: # Timing 10000 iterations of x, xr, xrs... # x: 0.469 wallclock secs (0.468 usr 0.005 sys 0.472 cpu) @ 21309.558/s (n=10000) # xr: 0.964 wallclock secs (0.977 usr 0.005 sys 0.982 cpu) @ 10375.392/s (n=10000) # xrs: 1.729 wallclock secs (1.752 usr 0.006 sys 1.759 cpu) @ 5782.135/s (n=10000) # O-----O---------O------O------O------O # | | Rate | x | xr | xrs | # O=====O=========O======O======O======O # | x | 21310/s | -- | -61% | -80% | # | xr | 10375/s | 155% | -- | -49% | # | xrs | 5782/s | 396% | 94% | -- | # O-----O---------O------O------O------O role XR[$cap] { has Int @!x; method set($i, $v) { @!x[$i] = $v; } }; role XRS[$cap] { has Int @!x[$cap]; method set($i, $v) { @!x[$i] = $v; } }; class X { has $!cap is built; has Int @!x; method TWEAK { @!x = Nil xx $!cap } method set($i, $v) { @!x[$i] = $v; } } use Bench; for (50, 10000) -> $iters { # warmup my $b = Bench.new; $b.cmpthese($iters, { x => { my $x = X.new(cap => 100); for ^100 { $x.set($_, 42) }; }, xr => { my $x = XR[100].new(); for ^100 { $x.set($_, 42) }; }, xrs => { my $x = XRS[100].new(); for ^100 { $x.set($_, 42) }; }, }); }