[Haskell-cafe] Streaming bytes and performance

Don Stewart dons00 at gmail.com
Tue Mar 19 22:16:33 CET 2013


This isn't a valid entry -- it uses strict IO (so allocates O(n) space) and
reads from standard input, which pretty much swamps the interesting
constant factors with buffered IO overhead.

Compare your program (made lazy) on lazy bytestrings using file IO:

import Prelude hiding ( readFile, foldl )
import Data.ByteString.Lazy.Char8

countSpace :: Int -> Char -> Int
countSpace i c | c == ' ' || c == '\n' = i + 1
               | otherwise             = i

main :: IO ()
main = readFile "test.txt" >>= print . foldl countSpace 0


Against my earlier optimized one (that manually specializes and does other
tricks).


$ time ./C
4166680
./C  1.49s user 0.42s system 82% cpu 2.326 total

$ time ./fast
4166680
./fast  1.05s user 0.11s system 96% cpu 1.201 total


The optimized one is twice as fast. You can write the same program on lists
, and it also runs in constant space but completes 32s instead  of 1.3

Constant factors matter.

On Tue, Mar 19, 2013 at 9:03 PM, Peter Simons <simons at cryp.to> wrote:

> Don Stewart <dons00 at gmail.com> writes:
>
>  > Here's the final program: [...]
>
> Here is a version of the program that is just as fast:
>
>   import Prelude hiding ( getContents, foldl )
>   import Data.ByteString.Char8
>
>   countSpace :: Int -> Char -> Int
>   countSpace i c | c == ' ' || c == '\n' = i + 1
>                  | otherwise             = i
>
>   main :: IO ()
>   main = getContents >>= print . foldl countSpace 0
>
> Generally speaking, I/O performance is not about fancy low-level system
> features, it's about having a proper evaluation order:
>
>  | $ ghc --make -O2 -funbox-strict-fields test1 && time ./test1
>  | 37627064
>  |
>  | real 0m0.381s
>  | user 0m0.356s
>  | sys  0m0.023s
>
> Versus:
>
>  | $ ghc --make -O2 -funbox-strict-fields test2 && time ./test2 <test.txt
>  | Linking test2 ...
>  | 37627064
>  |
>  | real 0m0.383s
>  | user 0m0.316s
>  | sys  0m0.065s
>
> Using this input file stored in /dev/shm:
>
>  | $ ls -l test.txt
>  | -rw-r--r-- 1 simons users 208745650 Mar 19 21:40 test.txt
>
> Take care,
> Peter
>
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20130319/a103980f/attachment.htm>


More information about the Haskell-Cafe mailing list