Skip to content

Instantly share code, notes, and snippets.

@zoffixznet
Created October 1, 2016 13:05
Show Gist options
  • Save zoffixznet/c31428d337c108987b0ad98a2bb25969 to your computer and use it in GitHub Desktop.
Save zoffixznet/c31428d337c108987b0ad98a2bb25969 to your computer and use it in GitHub Desktop.
# use lib '/home/zoffix/CPANPRC/rakudo/bug';
use nqp;
use Test;
use MONKEY-TYPING;
augment class Array {
multi method foo1 (Int:D $o, Whatever $x, **@a) { self.foo1: $o, $x, @a }
multi method foo1 (Int:D $o, Callable:D $x, **@a) { self.foo1: $o, $x, @a }
multi method foo1 (Int:D $o, Int:D $x, **@a) { self.foo1: $o, $x, @a }
multi method foo1 (Whatever $o, Whatever $x, **@a) { self.foo1: $o, $x, @a }
multi method foo1 (Whatever $o, Callable:D $x, **@a) { self.foo1: $o, $x, @a }
multi method foo1 (Whatever $o, Int:D $x, **@a) { self.foo1: $o, $x, @a }
multi method foo1 (Callable:D $o, Whatever $x, **@a) { self.foo1: $o, $x, @a }
multi method foo1 (Callable:D $o, Callable:D $x, **@a) { self.foo1: $o, $x, @a }
multi method foo1 (Callable:D $o, Int:D $x, **@a) { self.foo1: $o, $x, @a }
multi method foo1 (Array:D \SELF: *%_) {}
multi method foo1 (Array:D $: Whatever){}
multi method foo1 (Array:D $: Callable:D $offset){}
multi method foo1 (Array:D $: Int:D $offset){}
multi method foo1 (Array:D $: Whatever, Whatever){}
multi method foo1 (Array:D $: Whatever, Int:D $size){}
multi method foo1 (Array:D $: Callable:D $offset, Callable:D $size){}
multi method foo1 (Array:D $: Callable:D $offset, Whatever){}
multi method foo1 (Array:D $: Callable:D $offset, Int:D $size){}
multi method foo1 (Array:D $: Int:D $offset, Whatever){}
multi method foo1 (Array:D $: Int:D $offset, Callable:D $size){}
multi method foo1 (Array:D $: Int:D $offset, Int:D $size){}
multi method foo1 (Array:D $: Whatever, Whatever, @new){}
multi method foo1 (Array:D $: Whatever, Int:D $size, @new){}
multi method foo1 (Array:D $: Callable:D $offset, Callable:D $size, @new){}
multi method foo1 (Array:D $: Callable:D $offset, Whatever, @new){}
multi method foo1 (Array:D $: Callable:D $offset, Int:D $size, @new){}
multi method foo1 (Array:D $: Int:D $offset, Whatever, @new){}
multi method foo1 (Array:D $: Int:D $offset, Callable:D $size, @new){}
multi method foo1 (Array:D $: Int:D $offset, Int:D $size, @new){}
multi method foo2 ($x, $y, **@a) {
given self.^lookup('foo2').cando( \(self, $x, $y, @a) )[0] {
.signature eqv &?BLOCK.signature and die;
$_(self, $x, $y, @a);
}
}
multi method foo2 (Array:D \SELF: *%_) {}
multi method foo2 (Array:D $: Whatever){}
multi method foo2 (Array:D $: Callable:D $offset){}
multi method foo2 (Array:D $: Int:D $offset){}
multi method foo2(Array:D $: Whatever, Whatever){}
multi method foo2 (Array:D $: Whatever, Int:D $size){}
multi method foo2 (Array:D $: Callable:D $offset, Callable:D $size){}
multi method foo2 (Array:D $: Callable:D $offset, Whatever){}
multi method foo2 (Array:D $: Callable:D $offset, Int:D $size){}
multi method foo2 (Array:D $: Int:D $offset, Whatever){}
multi method foo2 (Array:D $: Int:D $offset, Callable:D $size){}
multi method foo2 (Array:D $: Int:D $offset, Int:D $size){}
multi method foo2 (Array:D $: Whatever, Whatever, @new){}
multi method foo2 (Array:D $: Whatever, Int:D $size, @new){}
multi method foo2 (Array:D $: Callable:D $offset, Callable:D $size, @new){}
multi method foo2 (Array:D $: Callable:D $offset, Whatever, @new){}
multi method foo2 (Array:D $: Callable:D $offset, Int:D $size, @new){}
multi method foo2 (Array:D $: Int:D $offset, Whatever, @new){}
multi method foo2 (Array:D $: Int:D $offset, Callable:D $size, @new){}
multi method foo2 (Array:D $: Int:D $offset, Int:D $size, @new){
# say "got it too";
}
}
sub timethese ($n, %what) {
my %results;
for %what.kv -> $name, &code {
my $start = now;
code for ^$n;
%results{$name} = now - $start;
}
%results;
}
say "starting";
my %res = timethese 100000, {
before => &before,
after => &after,
};
say "Before: %res<before>";
say " After: %res<after>";
printf " Diff: %.2f%%\n",
100*(%res<before> - %res<after>) / max(%res<before>,%res<after>);
sub before {
[].foo1: 0, 42, 1, 2, 3;
}
sub after {
[].foo2: 0, 42, 1, 2, 3;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment