[Vm-dev] A BlockClosure optimization

Eliot Miranda eliot.miranda at gmail.com
Sat May 15 16:35:26 UTC 2010


Hi Igor,

On Fri, May 14, 2010 at 10:14 PM, Igor Stasenko <siguctua at gmail.com> wrote:

>
> Hello,
>
> i just thought, that we could optimize a closure-copy mechanism
> to reuse a closure (BlockClosure instance), which were created before
> for same context.
>

    that's a good one.  Also good is precomputing closures for blocks that
don't capture their dynamic environment (don't close over any variables and
don't include an ^-return; VW parlance "clean blocks").  Another one, but
this requires a new bytecode set/vm is to not reify the current context for
blocks that don't contain ^-returns (VW parlance "copying blocks").  But
these last two should be preferences since they affect debugging (within a
block so optimized one can't discover its origin).

(VW parlance for normal blocks is "full blocks"; all blocks in my closure
compiler are full, so the current context must be reified, not an issue in
the non-Cog VMs as its already there, but it is an issue in a faster VM, it
often means two allocations instead of one).



> A mechanism of optimization can illustrated by following code.
>
> Suppose , you having a method, which using a loop:
>
> myMethod
>
>  1 to: 100 do: [:i |
>   dict at: i ifAbsent: [ foo bar ] ]
>
> The idea is to copy a closure from method's literal frame just once,
> and store it into temp,
> and then reuse it like following:
>
> myMethod
> | closure |
>  1 to: 100 do: [:i |
>   dict at: i ifAbsent: (closure ifNil: [ closure := [ foo bar ] ] ) ]
>
> ----------
>
> A simple benchmark shows that we could gain from it:
>
> [ 1000000 timesRepeat: [ [ 1+1] value ] ] timeToRun
> 670
>
> [
> | closure |  closure := nil.
> 1000000 timesRepeat: [
>        (closure ifNil: [ closure := [ 1+1] ]) value ]
> ] timeToRun
> 518
>
> As you can see, even implemented in smalltalk (without any changes to
> VM) it shows
> a significant performance boost.
>

That's what's nice about this optimization.  It doesn't require any VM
modifications ;)



> Of course, if we put something, which loads processor by real work,
> instead of just [1+1],
> the difference will be less significant.
>
> But apart from this, lying the fact, that copying closure object each
> time means memory allocation,
> and hence leads to more frequent GC.


What real codes have you seen the costs in?  I think they're there
(VisualWorks went to some effort to reduce costs using the two other
optimizations I described) but how big?  In any case you should implement
this and see whether any useful benchmarks (e.g. system recompilation) show
measurable speedups.


> --
> Best regards,
> Igor Stasenko AKA sig.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20100515/3dc98f73/attachment.htm


More information about the Vm-dev mailing list