Performance/IO
From HaskellWiki
(hGetBuf, and mmapped IO are options) |
(Updated with iteratees) |
||
| (4 intermediate revisions not shown.) | |||
| Line 1: | Line 1: | ||
| - | + | {{Performance infobox}} | |
| + | [[Category:Performance|IO]] | ||
| - | + | Before continuing, I strongly recommend reading [[Performance/Strings]] first. Fast I/O and string handling overlap in many places, so this page will only discuss the parts that are not specific to strings. | |
| - | buffer-based IO is an alternative (hGetBuf/hPutBuf). This can be | + | |
| - | particularly effective when combined with packed strings. | + | == Iteratee I/O == |
| + | |||
| + | [[Iteratee I/O|Iteratees]] are a relatively new approach to streaming I/O. If your code uses I/O extensively (for example, in a web server), iteratees are the best way to do it. | ||
| + | |||
| + | Using the [http://hackage.haskell.org/package/conduit Conduit] library, a program to read a file and pipe it to stdout can be written as follows: | ||
| + | |||
| + | <haskell> | ||
| + | main = runResourceT (sourceFile "test.txt" $$ sinkHandle stdout) | ||
| + | </haskell> | ||
| + | |||
| + | == Other solutions == | ||
| + | |||
| + | If this is too high-level for you, | ||
| + | buffer-based IO is an alternative (<code>hGetBuf</code>/<code>hPutBuf</code>). This can be | ||
| + | particularly effective when combined with packed strings (see [[wc]]). | ||
Some external libraries also provide memory mapped IO. | Some external libraries also provide memory mapped IO. | ||
| + | |||
| + | In 2006, someone came up with a solution called [[Library/Streams|Streams]]. However, it does not seem to be maintained anymore. | ||
Current revision
| Haskell Performance Resource
Constructs: Techniques: |
Before continuing, I strongly recommend reading Performance/Strings first. Fast I/O and string handling overlap in many places, so this page will only discuss the parts that are not specific to strings.
1 Iteratee I/O
Iteratees are a relatively new approach to streaming I/O. If your code uses I/O extensively (for example, in a web server), iteratees are the best way to do it.
Using the Conduit library, a program to read a file and pipe it to stdout can be written as follows:
main = runResourceT (sourceFile "test.txt" $$ sinkHandle stdout)
2 Other solutions
If this is too high-level for you,
buffer-based IO is an alternative (hGetBuf/hPutBuf). This can be
particularly effective when combined with packed strings (see wc).
Some external libraries also provide memory mapped IO.
In 2006, someone came up with a solution called Streams. However, it does not seem to be maintained anymore.
