Difference between revisions of "Performance/Arrays"

From HaskellWiki
Jump to navigation Jump to search
m (+infobox)
Line 2: Line 2:
 
== General Array techniques ==
 
== General Array techniques ==
   
* Remember that ordinary arrays are monolithic, and individual elements are not mutable. In particular, the <tt>(\\)</tt> operator copies the entire array, so it is rarely what you want. ([http://www.haskell.org/ghc/docs/latest/html/libraries/base/Data-Array-Diff.html Data.Array.Diff] provides a variant of arrays with O(1) <tt>(\\)</tt>, but that library has performance problems of its own).
+
* Remember that ordinary arrays are monolithic, and individual elements are not mutable. In particular, the <tt>(//)</tt> operator copies the entire array, so it is rarely what you want. ([http://www.haskell.org/ghc/docs/latest/html/libraries/base/Data-Array-Diff.html Data.Array.Diff] provides a variant of arrays with O(1) <tt>(//)</tt>, but that library has performance problems of its own).
   
 
* Monolithic arrays are by no means useless! Powerful array-construction facilities like <tt>accumArray</tt> can often eliminate the need for truly mutable arrays.
 
* Monolithic arrays are by no means useless! Powerful array-construction facilities like <tt>accumArray</tt> can often eliminate the need for truly mutable arrays.

Revision as of 16:33, 12 January 2006

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

General Array techniques

  • Remember that ordinary arrays are monolithic, and individual elements are not mutable. In particular, the (//) operator copies the entire array, so it is rarely what you want. (Data.Array.Diff provides a variant of arrays with O(1) (//), but that library has performance problems of its own).
  • Monolithic arrays are by no means useless! Powerful array-construction facilities like accumArray can often eliminate the need for truly mutable arrays.
  • If you really need mutable arrays for speed, then if possible use the ST variant, so that the stateful part of your program can be encapsulated (Data.Array.ST).

GHC-specific techniques

Use unboxed arrays (UArray, IOUArray)

GHC supports arrays of unboxed elements, for several basic arithmetic element types including Int and Char: see the Data.Array.Unboxed library library for details. Unboxed arrays support the same programmer interface as ordinary boxed arrays, so converting your code is easy. Using unboxed arrays will be a win in terms of both time and space.

There are also mutable unboxed arrays: IOUArray and STUArray (see Data.Array.IO and Data.Array.ST respectively). Using unboxed mutable arrays is often a good way to translate imperative algorithms into Haskell with similar performance.