develooper Front page | perl.perl6.language | Postings from January 2004

Re: run-once code

Thread Previous | Thread Next
Melvin Smith
January 14, 2004 08:02
Re: run-once code
Message ID:
At 10:16 PM 1/13/2004 -0700, Luke Palmer wrote:
>David Storrs writes:
> > Given this code:
> >
> >     if ( some_expensive_lookup_function() >= $MAX_RECORDS ) {
> >        mark_that_we_have_reached_max_records();
> >        return;
> >     }
> >
> > After I enter that block once, I never want to evaluate the condition
> > again--I want the code to completely disappear from the bytecode (or,
> > at least, be jumped around).  How would I do that in Perl 6?
>     my $max_reached;
>     sub mark_that_we_have_reached_max_records() {
>         $max_reached = 1;
>     }

If you use a hint in Perl6 to tell Parrot that $max_reached needs
to be a native type you'll probably get near C-speed conditional tests with
the JIT. (The JIT is many x faster than current Perl5 conditionals, but the
reason we don't rave about it more often is that languages like Perl6
lose a lot of what the JIT provides since we have to create most variables
as PMCs)

I think Perl6 will allow a hint like so:

my int $max_reached;

The important thing is that $max_reached is used simply as a conditional,
and you don't pass it to a routine or otherwise use it in a way to cause it 
to be
promoted to a PMC (which is much heavier than a native). Currently the back-end
compiler (imcc) doesn't coerce native types to a PMC, but it will eventually.
If you use a hint, and simply set and test the conditional, the compiler should
be able to allocate the conditional as a pure integer register, test it, 
and skip the
PMC promotion.

Then your worry about getting the test removed from the bytecode would
be needless as you'd probably only waste a couple of JITed CPU cycles.


Thread Previous | Thread Next Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at | Group listing | About