Personal tools

Performance/Overloading

From HaskellWiki

< Performance(Difference between revisions)
Jump to: navigation, search
m (Performance:Overloading moved to Performance/Overloading)
(comment about JHC not using dictionary-passing for typeclasses)
Line 2: Line 2:
 
== Overloaded functions are not your friend ==
 
== Overloaded functions are not your friend ==
   
Haskell's overloading (using type classes) is elegant, neat, etc., etc., but it is death to performance if left to linger in an inner loop. Each type class constraint on an overloaded function corresponds to an extra argument passed at runtime (called a ''dictionary''), and a reference to a class method is implemented by extracting a field from the dictionary. The presence of overloading can prevent many other optimisations, such as [[Performance:Strictness|Strictness]], from kicking in.
+
Haskell's overloading (using type classes) is elegant, neat, etc., etc., but it is death to performance if left to linger in an inner loop. Each type class constraint on an overloaded function corresponds to an extra argument passed at runtime (called a ''dictionary'') (except in [[JHC]]!), and a reference to a class method is implemented by extracting a field from the dictionary. The presence of overloading can prevent many other optimisations, such as [[Performance:Strictness|Strictness]], from kicking in.
   
 
How can you squash overloading?
 
How can you squash overloading?

Revision as of 21:48, 3 May 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

Overloaded functions are not your friend

Haskell's overloading (using type classes) is elegant, neat, etc., etc., but it is death to performance if left to linger in an inner loop. Each type class constraint on an overloaded function corresponds to an extra argument passed at runtime (called a dictionary) (except in JHC!), and a reference to a class method is implemented by extracting a field from the dictionary. The presence of overloading can prevent many other optimisations, such as Strictness, from kicking in.

How can you squash overloading?

Give explicit type signatures: Signatures are the basic trick; putting them on exported, top-level functions is good software-engineering practice, anyway. (GHC Tip: using -fwarn-missing-signatures can help enforce good signature-practice).

The automatic specialisation of overloaded functions (with -O) should take care of overloaded local and/or unexported functions.

Use SPECIALIZE pragmas: Specialize the overloading on key functions in your program. (Supported by: GHC, JHC).