Socket.hs problem under Windows 2000

Simon Marlow simonmar at microsoft.com
Thu Nov 2 06:33:23 EST 2000


> socket Handles are unbuffered by the default, so 
> if you change the buffering by inserting 
> 
>   hSetBuffering handle
>                 (BlockBuffered Nothing) -- or some such
> 
> after each call to socketToHandle / Socket.accept, you
> should get a boost in throughput.

Definitely - using the unbuffered sockets is likely to be slow due to the
overhead of GHC's I/O library.

If you're sending files over a socket, you can avoid the conversion to/from
Haskell Strings altogether, using GHC's hGetBuf/hPutBuf family (this is some
code from the web server):

bufsize = 4 * 1024 :: Int

-- squirt data from 'rd' into 'wr' as fast as possible.  We use a 4k
-- single buffer.
squirt rd wr = do
  arr <- stToIO (newCharArray (0, bufsize-1))
  let loop = do r <- hGetBufBAFull rd arr bufsize
	if (r == 0) 
		   then return ()
		   else if (r < bufsize) 
     			    then hPutBufBAFull wr arr r
     			    else hPutBufBAFull wr arr bufsize >> loop
  loop

Cheers,
	Simon




More information about the Glasgow-haskell-bugs mailing list