[Pharo-project] Preallocation behavior

Stéphane Ducasse stephane.ducasse at inria.fr
Thu Apr 28 11:27:15 CEST 2011


may be you could add a bug entry on the cog tracker

stef

On Apr 28, 2011, at 12:25 PM, Henrik Sperre Johansen wrote:

> On 28.04.2011 12:12, Toon Verwaest wrote:
>> nextPut: anObject
>>    "Primitive. Insert the argument at the next position in the Stream
>>    represented by the receiver. Fail if the collection of this stream is not an
>>    Array or a String. Fail if the stream is positioned at its end, or if the
>>    position is out of bounds in the collection. Fail if the argument is not
>>    of the right type for the collection. Optional. See Object documentation
>>    whatIsAPrimitive."
>> 
>> <primitive: 66>
>>    position >= writeLimit
>>        ifTrue: [^ self pastEndPut: anObject]
>>        ifFalse:
>>            [position := position + 1.
>>            ^collection at: position put: anObject]
>> 
>> The primitive will only fail if you are trying to write past the end. This check is very fast since it's primitive... and we'll only go in Smalltalk code when it fails. The first version on the other hand is always first some smalltalk code (quite a lot for your basic example) before it goes into a slightly more heavy primitive (replaceFrom:to:with:startingAt:).
> To be exact, the primitive always fails on Cog (not implemented, jitted version is just as fast), and only works for non-ReadWriteable streams on newish (last year or so) VM's :)
> http://forum.world.st/Bug-in-Interpreter-gt-gt-primitiveNextPut-td788236.html
> 
> The constant overhead is still lower than nextPutAll: of course.
> 
> Cheers,
> Henry
> 
> 
> 
> 
> 




More information about the Pharo-project mailing list