Skip to content

Commit

Permalink
Make @a.splice(offset) about 20% faster
Browse files Browse the repository at this point in the history
- uses the new nqp::splice op
- probably faster still for larger result sets
- fewer allocations, so more memory / GC friendly
  • Loading branch information
lizmat committed May 15, 2018
1 parent 9aa6747 commit 8d12d5b
Showing 1 changed file with 15 additions and 13 deletions.
28 changes: 15 additions & 13 deletions src/core/Array.pm6
Original file line number Diff line number Diff line change
Expand Up @@ -945,20 +945,22 @@ my class Array { # declared in BOOTSTRAP
}
method !splice-offset(int $offset) {
nqp::stmts(
(my int $elems = nqp::elems(nqp::getattr(self,List,'$!reified'))),
(my int $size = nqp::sub_i($elems,$offset)),
nqp::bindattr((my $result:= nqp::create(self)),List,'$!reified',
(my $buffer := nqp::setelems(nqp::create(IterationBuffer),$size))),
nqp::bindattr($result,Array,'$!descriptor',$!descriptor),
(my int $i = nqp::sub_i($offset,1)),
nqp::while(
nqp::islt_i(($i = nqp::add_i($i,1)),$elems),
nqp::bindpos($buffer,nqp::sub_i($i,$offset),
nqp::atpos(nqp::getattr(self,List,'$!reified'),$i))
(my $reified := nqp::getattr(self,List,'$!reified')),
(my int $elems = nqp::elems($reified)),
(my $result:= nqp::create(self)),
nqp::unless(
nqp::iseq_i($offset,$elems),
nqp::stmts(
nqp::bindattr($result,List,'$!reified',nqp::slice($reified,$offset,-1)),
nqp::splice(
$reified,
$empty,
$offset,
nqp::sub_i(nqp::elems($reified),$offset)
),
)
),
nqp::splice(
nqp::getattr(self,List,'$!reified'),$empty,$offset,$size),
$result
nqp::p6bindattrinvres($result,Array,'$!descriptor',$!descriptor)
)
}
method !splice-offset-fail($got) {
Expand Down

0 comments on commit 8d12d5b

Please sign in to comment.