[Haskell-cafe] I/O performance drop in ghc 6.12.1
Peter Simons
simons at cryp.to
Thu Jan 14 17:30:29 EST 2010
Hi,
I just updated to GHC 6.12.1, and I noticed a significant drop in I/O
performance that I can't explain. The following code is a simple
re-implementation of cat(1), i.e. it just echos all data from standard
input to standard output:
> module Main ( main ) where
>
> import System.IO
> import Foreign ( allocaBytes )
>
> bufsize :: Int
> bufsize = 4 * 1024
>
> catBuf :: Handle -> Handle -> IO ()
> catBuf hIn hOut = allocaBytes bufsize input
> where
> input ptr = hGetBuf hIn ptr bufsize >>= output ptr
> output _ 0 = return ()
> output ptr n = hPutBuf hOut ptr n >> input ptr
>
> main :: IO ()
> main = do
> mapM_ (\h -> hSetBuffering h NoBuffering) [ stdin, stdout ]
> catBuf stdin stdout
That program used to have exactly the same performance as /bin/cat, but
now it no longer does:
| $ dd if=/dev/urandom of=test.data bs=1M count=512
|
| $ time /bin/cat <test.data >/dev/null
|
| real 0m1.939s
| user 0m0.003s
| sys 0m1.923s
|
| $ time ./cat-hgetbuf <test.data >/dev/null
|
| real 0m4.327s
| user 0m1.967s
| sys 0m2.317s
I've tested different variants of the program that were built with -O,
-O2, and -O2 -funbox-strict-fields, respectively, but it doesn't seem to
make a difference.
Is there something I'm missing? Any suggestion would be kindly
appreciated.
Take care,
Peter
More information about the Haskell-Cafe
mailing list