From a974de9ba6a137c6e0aa14480d1a5c8c4a6786e2 Mon Sep 17 00:00:00 2001 From: Elizabeth Mattijsen Date: Tue, 5 Dec 2017 21:02:00 +0100 Subject: [PATCH] Make R:It:ReifiedArray 15% to 30% faster - make sure pull-one is as simple as possible - add a !hole method for handling holes in $!reified - make push-all also use !hole method - use lexical $i in push-all for slighly faster performance --- src/core/Rakudo/Iterator.pm | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/src/core/Rakudo/Iterator.pm b/src/core/Rakudo/Iterator.pm index e731dedf577..a26bb104fc7 100644 --- a/src/core/Rakudo/Iterator.pm +++ b/src/core/Rakudo/Iterator.pm @@ -2414,17 +2414,20 @@ class Rakudo::Iterator { } method new(\arr, Mu \des) { nqp::create(self)!SET-SELF(arr, des) } + method !hole(int $i) is raw { + nqp::p6bindattrinvres( + (my \v := nqp::p6scalarfromdesc($!descriptor)), + Scalar, + '$!whence', + -> { nqp::bindpos($!reified,$i,v) } + ) + } method pull-one() is raw { nqp::ifnull( nqp::atpos($!reified,$!i = nqp::add_i($!i,1)), nqp::if( nqp::islt_i($!i,nqp::elems($!reified)), # found a hole - nqp::p6bindattrinvres( - (my \v := nqp::p6scalarfromdesc($!descriptor)), - Scalar, - '$!whence', - -> { nqp::bindpos($!reified,$!i,v) } - ), + self!hole($!i), IterationEnd ) ) @@ -2433,18 +2436,14 @@ class Rakudo::Iterator { method push-all($target --> IterationEnd) { nqp::stmts( (my int $elems = nqp::elems($!reified)), + (my int $i = $!i), nqp::while( # doesn't sink - nqp::islt_i($!i = nqp::add_i($!i,1),$elems), - $target.push(nqp::ifnull( - nqp::atpos($!reified,$!i), - nqp::p6bindattrinvres( - (my \v := nqp::p6scalarfromdesc($!descriptor)), - Scalar, - '$!whence', - -> { nqp::bindpos($!reified,$!i,v) } - ) - )) - ) + nqp::islt_i($i = nqp::add_i($i,1),$elems), + $target.push( + nqp::ifnull(nqp::atpos($!reified,$i),self!hole($i)) + ) + ), + ($!i = $i) ) } method skip-one() {