Difference between revisions of "Performance/IO"
m (Added link too WC page) |
Lambda Fairy (talk | contribs) (Updated with iteratees) |
||
(2 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
{{Performance infobox}} |
{{Performance infobox}} |
||
+ | [[Category:Performance|IO]] |
||
− | ==I/O== |
||
+ | 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. |
||
− | If the standard lazy IO operations are proving to be a bottleneck, |
||
+ | |||
⚫ | |||
+ | == 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, |
||
⚫ | |||
particularly effective when combined with packed strings (see [[wc]]). |
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. |
Latest revision as of 02:13, 12 July 2012
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.
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)
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.