unsafePerformIO and NOINLINE Pragma

Jan Christiansen jac at informatik.uni-kiel.de
Wed Sep 14 10:55:50 EDT 2005


Am Dienstag, 13. September 2005 16:13 schrieb David Sabel:
> Hi,
>
> > Hi!
> >
> > I want to analyse the laziness of a data structure. To check how many
> > nodes are constructed I use a global counter.
> >
> > counter :: IORef Int
> > counter = unsafePerformIO (newIORef 0)
> >
> > This counter is increased every time the constructor is called by
> > redefining the constructor OBDD as follows.
> >
> > oBDD low var high =
> >   seq (unsafePerformIO (modifyIORef counter (+1))) (OBDD low var high)
> >
> > This works fine.
> > When I compile with optimisations the counter is always set to one no
> > matter how many nodes are constructed. I thought this would be caused by
> > inlining. Therefore I have added two NOINLINE pragmata.
> >
> > {-# NOINLINE counter #-}
> > {-# NOINLINE oBDD #-}
> >
> > Although the counter doesn't work. Is there another optimisation that can
> > cause harm? Is there something wrong with the pragmata?
>
> Two comments:
> 1. There are other optimisations than inlining that can break sharing, e.g.
>    common subexpression elimination, full-laziness-transformation.
>
> 2. I tested the following:
>
>   {-# NOLINE counter #-}
>   {-# INLINE oBDD #-}
>
>   then the counter "seems" to work correct.  In my opinion
>   oBDD is an abstraction and can always be inlined.

Sadly this solution doesn't work in my environment. The counter is always set 
to 2 while it should be something around 15.000. I think it's not worth going 
into detail of the transformations for me thus I will check the number of 
nodes without optimisations and the performance with optimisations. Thanks 
anyway.


More information about the Glasgow-haskell-users mailing list