turn off let floating

Simon Marlow simonmar at microsoft.com
Thu Apr 15 10:25:20 EDT 2004


> So I have code like:
> 
>    {-# NOINLINE count #-}
>    count :: IORef Int
>    count = unsafePerformIO $ newIORef 0
> 
>    {-# NOINLINE getCount #-}
>    getCount :: (Int -> a) -> a
>    getCount f
>       = let nextCount
>              = (unsafePerformIO $
>                   do oldCount <- readIORef count
>                      let newCount = oldCount + 1
>                      writeIORef count newCount
>                      return oldCount)
>         in seq nextCount (f nextCount)
> 
> It seems to work okay.
> 
> However, if you have any suggestions about how to make a FAST 
> global counter
> I would be very glad to hear it. From profiling it seems like 
> this code
> is a little expensive (also it is called quite frequently).

You could try the FastMutInt module from GHC
(ghc/compiler/utils/FastMutInt.hs) to speed things up.  Unfortunately
unsafePerformIO has some unavoidable overhead: it can't be inlined
because we don't want the compiler to see its definition.

Cheers,
	Simon


More information about the Glasgow-haskell-users mailing list