[Pharo-project] Preallocation behavior

jannik.laval jannik.laval at gmail.com
Thu Apr 28 08:35:18 CEST 2011


Hi all,

I am playing with MessageTally, and I have a strange result with prealocation.
Here is my example. I am working on a PharoCore1.3, with a VM4.2.5

First of all, I spy this source code:
====
MessageTally spyOn: 
     [ 500 timesRepeat: [
                     | str |  
                     str := ''. 
                     9000 timesRepeat: [ str := str, 'A' ]]].
====

The result appears after 24 961 ms.
An optimization is to use a Stream. Here is my source code:
===
MessageTally spyOn: 
     [ 500 timesRepeat: [
                     | str |  
                     str := WriteStream on: (String new). 
                     9000 timesRepeat: [ str nextPut: $A ]]].
===

The result appears after 812 ms, which is a large improvement.
Now, we could optimize again using the preallocation. Here is my source code:

====
MessageTally spyOn: 
    [ 500 timesRepeat: [
                    | str |  
                    str := WriteStream on: (String new: 10000). 
                    9000 timesRepeat: [ str nextPutAll: 'A' ]]].
====

And the result is strange: it makes 2 times slower to display the result.
The result appears after 1656 ms.

Here is the spy result:
===
 - 1656 tallies, 1656 msec.

**Tree**
--------------------------------
Process: (40s)  464519168: nil
--------------------------------
**Leaves**
22.9% {380ms} UndefinedObject>>DoIt
22.5% {373ms} SmallInteger(Integer)>>timesRepeat:
22.2% {368ms} WriteStream>>nextPutAll:
===

There is the call of UndefinedObject>>DoIt which is added and takes time.
Does anyone know what is done during the preallocation ?
Why is it slower than non-preallocation ?

Thanks for your answers.
Jannik
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.gforge.inria.fr/pipermail/pharo-project/attachments/20110428/901a0595/attachment.htm>


More information about the Pharo-project mailing list