Replaced throw to throwIO where type is IO

Bas van Dijk v.dijk.bas at gmail.com
Sat Sep 25 11:12:21 EDT 2010


On Sat, Sep 25, 2010 at 4:41 PM, Bas van Dijk <v.dijk.bas at gmail.com> wrote:
> However I do wonder why onException is using throw instead of the
> recommended throwIO. Has this to do with performance since they're
> both primitive operations:
>
> throw :: Exception e => e -> a
> throw e = raise# (toException e)
>
> throwIO :: Exception e => e -> IO a
> throwIO e = IO (raiseIO# (toException e))

I think I found the answer myself.

I see that raiseIO# is implemented as jumping to the implementation of raise#:

rts/Exception.cmm line: 588

stg_raiseIOzh
{
  /* Args :: R1 :: Exception */
  jump stg_raisezh;
}

So I guess using #raise directly is faster since it doesn't need to
perform the jump.

I'll see if I can make some Criterion benchmarks to see if it's actually faster.

Bas


More information about the Libraries mailing list