> 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
signature.asc
Description: Message signed with OpenPGP using GPGMail