> On 02 Jan 2016, at 10:58 , Hilaire <hila...@drgeo.eu> wrote:
> 
> Hello,
> 
> With Pharo3, in an object of mine, I want its text representation to
> come with the EURO symbol:
> 
> CGMoney>>printOn: aStream
>       aStream << (amount asScaledDecimal: 2) greaseString
>               << ' ' << '€'
> 
> 
> It appears to be very slow when I browse such collection of objects
> (says 1500) from an inspector
> 
> Replacing '€' by 'EUR' gives back normal rendering time.
> 
> Indeed the '€' is encoded as WideString, so not sure what is happening.
> All content converted to WideString or what?


In the fallback code for WriteStream >> #nextPut:, at:put: is called,  so yes, 
streaming a wide char causes the streams collection to be converted from Byte 
to WideString.
Conversion is done using become, which currently triggers a full heap scan for 
references, and is thus very slow.
One could add a fast-path along the lines of #pastEndPut: (which has already 
broken any assumption that a reference to the collection will reflect all 
writes for the lifetime of stream, for the same performance problems one would 
face using #become:); if collection is a ByteString and anObject is a wide 
characters, replace collection with a WideString, and *then* call at:put:
But, it is not a very nice thing to add to a generic streaming class, nor is it 
a very attractive at this point in time considering that making become: a fast 
operation is one of the problems solved by Spur.

Cheers,
Henry

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

Reply via email to