[Pharo-project] Preallocation behavior

Andres Valloud avalloud at smalltalk.comcastbiz.net
Thu Apr 28 09:26:16 CEST 2011


Maybe in the last case you also need to send nextPut: instead of 
nextPutAll:...

On 4/27/11 23:35 , jannik.laval wrote:
> 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



More information about the Pharo-project mailing list