[Vm-dev] postponing tempVector creation

Clément Bera bera.clement at gmail.com
Thu Oct 17 13:43:45 UTC 2013


Yeah I guess this idea is too much work for the debugger comparing to what
we can earn from it.

@Nicolas Cellier
Currently the tempVector is always created at the beginning of the method,
so the debugger is fine. The debugger can halt only on message sends / back
jumps, so when you halt in a context to debug it, as the tempVector
creation bytecodes are necessarily before the message send / back jump on
which you halt, the tempVector is necessarily created before.




2013/10/17 Nicolas Cellier <nicolas.cellier.aka.nice at gmail.com>

>
> I had exactly same question yesterday coming to my mind, but isn't it yet
> like that?
>
>
> 2013/10/17 Igor Stasenko <siguctua at gmail.com>
>
>>
>> how about debugger
>> and accessing context state?
>> it going to be complicated, since at some stages temps not even allocated.
>>
>>
>> On 16 October 2013 14:53, Clément Bera <bera.clement at gmail.com> wrote:
>>
>>>
>>> Hello,
>>>
>>> Recently I realized that the tempVector is always created at the
>>> beginning of the method. In the case of:
>>>
>>> foo
>>>     | temp |
>>>     true ifTrue: [ ^ self ].
>>>     [ temp := 1 ] value.
>>>
>>> It means that even if the execution flow goes to the quick return
>>> direction, the tempVector is created even if it is not used. I hacked a bit
>>> the compiler to lazily create the tempVector when needed (access to temp
>>> Vector variable or block closure creation), which means here the tempVector
>>> would be created just before the pushClosure bytecode and not at the
>>> beginning of the method.
>>>
>>> I got as result that this specific method was executed 50,000,000 times
>>> per second instead of 21,000,000 times per second. Probably because of some
>>> useless garbage collection avoided.
>>>
>>> The problem of this lazy tempVector initialization is that I never know
>>> where I am in the control flow graph. This means than in the case:
>>>
>>> bar
>>>     | temp |
>>>     false ifTrue: [ temp := 1 ].
>>>     [ temp := 2 ].
>>>
>>> It is hard to detect where to add the extra bytecode for lazy tempVector
>>> initialization, because the first time you need it is in a branch, so if
>>> you create the tempVector in the branch and the execution flow goes in the
>>> other direction then the tempVector will not have been initialized.
>>>
>>> Has any of you already investigated in this direction ? Does it worth it
>>> to implement that ?
>>>
>>> Thanks for any answers.
>>>
>>>
>>
>>
>> --
>> Best regards,
>> Igor Stasenko.
>>
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20131017/9001fbbc/attachment.htm


More information about the Vm-dev mailing list