[Haskell-cafe] HasCallStack - runtime costs?

Johannes Waldmann johannes.waldmann at htwk-leipzig.de
Fri Mar 4 14:53:36 UTC 2016

Dear Cafe,

the new (8.*) call stack feature
is certainly nice for debugging during development.

But how costly is it at runtime? I notice a 5 percent slowdown.

That's not a problem if there's an easy way to switch
this off for production (without changing the code).

Related: how to make code that uses it,
compile with older ghcs that don't have it.

I made this hack: do not import GHC.Stack.Types, but instead

{-# language CPP, MultiParamTypeClasses #-}

#if (__GLASGOW_HASKELL__ < 710)
{-# language NullaryTypeClasses #-}

module Stack
( HasCallStack )

#if (__GLASGOW_HASKELL__ >= 800)
import GHC.Stack.Types
class HasCallStack
instance HasCallStack

When I compile with 8.rc2, and change ">= 800" to ">= 900",
I am getting the 5 percent speedup mentioned above.

But does it really do what I hope it does
(remove all runtime overhead that call stacks may have)?

When I compile with 7.10.3, I am getting 5 .. 10 percent faster again.

My code does nothing fancy (w.r.t. types and libraries),
it just uses Data.IntMap heavily. And it has some

class Semiring s where
  zero :: s
  one  :: s
  plus :: HasCallStack => s -> s -> s
  times :: HasCallStack => s -> s -> s

- J.W.

More information about the Haskell-Cafe mailing list