Working on Petit Delphi we found a strange implementation for asPetitStream:
Stream>asPetitStream
        ^ self contents asPetitStream

Further investigation showed that the basic peek was not fast enough for Petit 
Parser, as it is used a lot. So it implemented a "improved unchecked peek":
PPStream>peek
        "An improved version of peek, that is slightly faster than the built in 
version."
        ^ self atEnd ifFalse: [ collection at: position + 1 ]

PPStream>uncheckedPeek
        "An unchecked version of peek that throws an error if we try to peek 
over the end of the stream, even faster than #peek."
        ^ collection at: position + 1

But in my knowledge a basic peek should be fast. The real problem is the peek 
in the underlying peek:
PositionableStream>peek
        "Answer what would be returned if the message next were sent to the 
        receiver. If the receiver is at the end, answer nil."

        | nextObject |
        self atEnd ifTrue: [^nil].
        nextObject := self next.
        position := position - 1.
        ^nextObject

That actually uses "self next". The least thing one should do is to cache the 
next object. But isn't there a primitive for peek in a file stream? Because al 
overriding peeks of PositionableStream have basically the same implementation: 
reading the next and restoring the state to before the peek (that is slow). So 
we would like to be able to remove PPStream without causing performance issues, 
as the only added method is the "improved peek".

Stephan and Diego

Reply via email to