[Vm-dev] Bug in Interpreter>>primitiveNextPut:

Henrik Sperre Johansen henrik.s.johansen at veloxit.no
Fri Nov 27 00:34:38 UTC 2009


On 26.11.2009 23:26, Eliot Miranda wrote:
>   
>
>
> Hi Levente,
>
> On Thu, Nov 26, 2009 at 12:01 PM, Levente Uzonyi <leves at elte.hu 
> <mailto:leves at elte.hu>> wrote:
>
>
>     On Thu, 26 Nov 2009, Eliot Miranda wrote:
>
>
>         I wouldn't bother trying to fix the primitive.  Both in
>         VisualWorks and at Teleplace the experience has been the same,
>         getting rid of the primitives for next, nextPut: and atEnd
>         sped things up.  The system is simply too complex nowadays for
>         these primitives to pay for themselves because they only cover
>         a small number of cases.  The primitives support Array and
>         ByteString bow there are so many different kinds of arrays
>         being streamed over that the cost of primitive failures
>         outweigh the benefits of primitive successes.
>
>
>     We are using these primitives in our own stream implementation
>     like this:
>
>     next
>
>     <primitive: 65>
>            [ position < readLimit ] whileFalse: [ self receiveData ].
>            ^buffer at: (position := position + 1)
>
>     And it does make a difference (buffer is a 8kiB sized ByteArray).
>     Would this be faster without the primitive?
>
>
> I can't guarantee it.  You'd have to measure.  All I can say is that 
> we found it better to get rid of the stream primitives in VisualWorks 
> and in the Cog JIT.  Looking at the Squeak VM code I think the 
> primitives will still win in the interpreter; after all they use the 
> same machinery as at: and at:put:.  But in a JIT they'll likely loose.
>
> Since the Cog JIT isn't available yet I'm not really being helpful.  I 
> should think before I blurt.  Apologies.
>
> Eliot
>
>
>     Levente
>
>
FWIW, I'd take a JIT anyday over this bug getting fixed :)
On the other hand, it's a one-word fix which merely improves performace 
while we're waiting (unless someone decides to remove the primtive calls 
from the image altogether, then it merely becomes obsolete), so I hardly 
see the harm in applying it.

Cheers,
Henry

PS. Speaking of unneccessary overhead, what about that collection class 
== ByteString part for _every_ stream nextPut: , when ByteString at:put: 
will handle the case correctly anyways if collection is in fact a 
ByteString? Not to mention how it performs for ByteString currencly, 
seeing as the primitive now _does_ fail every time.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20091127/5a6087d2/attachment.htm


More information about the Vm-dev mailing list