On 04 Nov 2013, at 5:12 , Sven Van Caekenberghe <
sven@stfx.eu> wrote:
Well, I just realised that ZnCharacterReadStream and ZnCharacterWriteStream did not yet make use of the optimisations that I did for ZnCharacterEncoding some time ago. More specifically, they were not yet using #next:putAll:startingAt:toStream: and #readInto:startingAt:count:fromStream: which are overwritten for ZnUTF8Encoder with (super hacked) versions that assume most of the input will be ASCII (a reasonable assumption).
I am still chasing a bug, but right now:
[ (ZnCharacterReadStream on: ('timezones.json' asFileReference readStream binary))
next: 65536; close ] bench.
"135 per second.� BEFORE
"3,310 per second.� AFTER
But of course the input file is ASCII, so YMMV.
I�ll let you know when I commit this code.
Sven
Yeah� sooo, I loaded the updated version, great improvement for streams on Latin1 content :D
Maybe it�s just me, but I tested with actual wide source as well (it was as slow as you�d expect), and I think you need a notQuiteSoOptimizedReadInto* which uses the normal Byte -> Wide become: conversion machinery.
Writing a ZnByteStringBecameWideString handler for every next: (and cousins) call where source may be non-latin1 is a real chore/nasty surprise for those used to dealing with legacy streams/converters...
You can sort of kinda make up for the performance hit (at least on these sizes) with a faster replace:from:to:with:startingAt: in use after the fact, by using basicAt:put: to the string, thus avoiding converting the replacement value to character.
Cheers,
Henry
PS: Why is ZnByteStringBecameWideString a notification and not a resumable exception? I would assume those who run into it without a handler would rather have an actual error, than a result where their string has been read up to the first wide char...