ghc -O2 and class dictionaries

Dave Bayer bayer at
Sun Dec 28 10:29:13 EST 2008

Using "ghc -O2" while tuning a class instance for performance, I  
obtained a 13% speedup by applying the transformation

>   instance (Ord a, Num b) ⇒ Sum PSum a b where
>     empty      = empty
>     insert     = insert
>     union      = union
>     unions     = unions
>     extractMin = extractMin
>     fromList   = fromList
>     toList     = toList
>     map        = map
>     mapMaybe   = mapMaybe

and defining the instance functions outside the instance declaration,  
rather than inside the instance declaration.

Conceptually, I understand this as follows: After this transformation,  
none of the recursive calls have to go through the class dictionary.

Is this a transformation that ghc could automatically apply while  
optimizing? It is clear at compile time that the recursive calls are  
from this instance. Every 13% helps.

(My example is adapting a pairing heap to sums of terms, e.g. to  
define an algebra from a small category. So far, I can't beat  
Data.Map, but I'm not done tuning. Other examples might not show the  
same performance increase from this transformation.)

More information about the Glasgow-haskell-users mailing list