[Haskell-cafe] Re: binary IO

Peter Simons simons at cryp.to
Thu Dec 29 09:58:29 EST 2005


Bulat Ziganshin writes:

 > your BlockIO library is great, but it's usage is limited
 > to very specific sutuations - when we can save pass state
 > between processing of individual bytes

In my experience, any other approach to I/O is slow. If you
don't have an explicit state between processing of
individual bytes, you have an implicit state. Making that
state (the I/O buffer) explicit gives you control over how
it is used and how it is evaluated. With an implicit state
(lazy evaluation), you have no control.

Fast I/O is a matter of application design. BlockIO is fast
because its API forces you to design your applications as
stateful, interruptible computations -- a finite state
machine. If you don't want to design your I/O application as
a finite state machine, then it will be slow regardless of
the I/O library you use. It sucks, but that is my
experience.

This phenomenon isn't specific to Haskell, by the way. C++'s
std::iostream is another fine example for an implicit state
API that is beautiful, elegant, and quite useless for
high-performance I/O.


 > what for (de)serialization tasks? my best attempts is
 > still 10x slower than C version. can you roll up little
 > prototype for such library or just sketch an ideas so i
 > can try to implement it?

The "Fast I/O" article I posted a few days ago is my
unfinished attempt at writing an efficient, general-purpose
binary I/O library for Haskell. I don't know how soon I'll
be able to complete that, nor do I know whether it would be
useful to many Haskell programmers if I do complete it. The
original BlockIO code has been stable (and quite fast) for
over a year or so, but I wouldn't know of anyone actually
using it. Apparently, designing explicit state data types is
nothing the Haskell community is fond of. :-)

Peter



More information about the Haskell-Cafe mailing list