
On Tuesday 28 September 2004 22:19, John Goerzen wrote:
[program that calls isEOF once per line deleted]
but it seems wasteful to poll isEOF so much.
I think all Haskell implementations have a buffering layer between the Haskell level and the operating system. So, calls to hGetLine, hIsEOF, etc. don't make (expensive) calls to the operating system but, instead, make (cheap) function calls to the I/O library to examine the state of the buffer for that file. In other words, calling isEOF is pretty cheap. That said, if you want to write a cat-like program which is as fast as Unix cat, you should not process data a character at a time or a line at a time but, rather, read fixed size blocks. Ideally the block size would match what the OS can provide efficiently and you would avoid introducing additional layers of buffering. You would also avoid converting from the external representation (a sequence of bytes in memory) to some internal representation (a linked list of characters, an array of unboxed values, or whatever) since you will waste a lot of time in conversion. -- Alastair Reid ps It sounds like you're trying to learn Haskell by writing programs with lots of I/O in them. This isn't really playing to Haskell's strengths and forces you to learn some tricky stuff (and, if chasing performance, learn some murky, non-portable libraries) before you learn what Haskell is really good for.