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