Skip to content

Commit

Permalink
Reimplement Hash.classify/categorize using nqp primitives
Browse files Browse the repository at this point in the history
This makes for about a 40% reduction in CPU
  • Loading branch information
lizmat committed Jul 29, 2013
1 parent 72b1b02 commit 5628e68
Showing 1 changed file with 15 additions and 21 deletions.
36 changes: 15 additions & 21 deletions src/core/Hash.pm
Expand Up @@ -108,51 +108,45 @@ my class Hash {
proto method classify(|) { * } proto method classify(|) { * }
multi method classify( &test, *@list ) { multi method classify( &test, *@list ) {
fail 'Cannot .classify an infinite list' if @list.infinite; fail 'Cannot .classify an infinite list' if @list.infinite;
for @list { nqp::push( nqp::p6listitems(nqp::decont(self{test $_} //= [])), $_ )
self{test $_}.push: $_; for @list;
}
self; self;
} }
multi method classify( %test, *@list ) { multi method classify( %test, *@list ) {
fail 'Cannot .classify an infinite list' if @list.infinite; fail 'Cannot .classify an infinite list' if @list.infinite;
for @list { nqp::push( nqp::p6listitems(nqp::decont(self{%test{$_}} //= [])), $_ )
self{ %test{$_} }.push: $_; for @list;
}
self; self;
} }
multi method classify( @test, *@list ) { multi method classify( @test, *@list ) {
fail 'Cannot .classify an infinite list' if @list.infinite; fail 'Cannot .classify an infinite list' if @list.infinite;
for @list { nqp::push( nqp::p6listitems(nqp::decont(self{@test[$_]} //= [])), $_ )
self{ @test[$_] }.push: $_; for @list;
}
self; self;
} }


proto method categorize(|) { * } proto method categorize(|) { * }
multi method categorize( &test, *@list ) { multi method categorize( &test, *@list ) {
fail 'Cannot .categorize an infinite list' if @list.infinite; fail 'Cannot .categorize an infinite list' if @list.infinite;
for @list { for @list -> $l {
for test($_) -> $k { nqp::push( nqp::p6listitems(nqp::decont(self{$_} //= [])), $l )
self{$k}.push: $_; for test($l);
}
} }
self; self;
} }
multi method categorize( %test, *@list ) { multi method categorize( %test, *@list ) {
fail 'Cannot .categorize an infinite list' if @list.infinite; fail 'Cannot .categorize an infinite list' if @list.infinite;
for @list { for @list -> $l {
for %test{$_} -> $k { nqp::push( nqp::p6listitems(nqp::decont(self{$_} //= [])), $l )
self{$k}.push: $_; for %test{$l};
}
} }
self; self;
} }
multi method categorize( @test, *@list ) { multi method categorize( @test, *@list ) {
fail 'Cannot .categorize an infinite list' if @list.infinite; fail 'Cannot .categorize an infinite list' if @list.infinite;
for @list { for @list -> $l {
for @test[$_] -> $k { nqp::push( nqp::p6listitems(nqp::decont(self{$_} //= [])), $l )
self{$k}.push: $_; for @test[$l];
}
} }
self; self;
} }
Expand Down

0 comments on commit 5628e68

Please sign in to comment.