Personal tools

Performance/IO

From HaskellWiki

< Performance(Difference between revisions)
Jump to: navigation, search
(Expand on Library/Streams description.)
(Updated with iteratees)
 
Line 1: Line 1:
 
{{Performance infobox}}
 
{{Performance infobox}}
 
[[Category:Performance|IO]]
 
[[Category:Performance|IO]]
==I/O==
 
   
If the standard lazy IO operations are proving to be a bottleneck,
+
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
+
  +
== 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]]).
 
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.
   
[[Library/Streams]] is a new (in 2006) approach to I/O, which claims to be 5-10 times faster on some operations than handle-based 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:
Data Types - Functions
Overloading - FFI - Arrays
Strings - Integers - I/O
Floating point - Concurrency
Modules - Monads

Techniques:
Strictness - Laziness
Avoiding space leaks
Accumulating parameter

Implementation-Specific:
GHC - nhc98 - Hugs
Yhc - JHC

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.

[edit] 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)

[edit] 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.