Array.ST is not being nice to me
Simon Marlow
simonmarhaskell at gmail.com
Mon Feb 11 06:25:58 EST 2008
Robert van Herk wrote:
> Hi all,
>
>
> > >> So my theory now is:
> > >> I do a large number of lookups.
> > >
> > > Try using Data.Array.Base.unsafeRead (and maybe
> > > ata.Array.Base.unsafeWrite). These avoid the bounds checking on the
> > > index each time you lookup something in the array.
> >
> > Right. Also keep an eye on the GC time (+RTS -sstderr) if you're using
> > boxed mutable arrays - we don't do card-marking, so GC is pretty
> > sub-optimal when it comes to large mutable boxed arrays. Decreasing the
> > number of GCs with +RTS -A<big> can help if you're suffereing from
> this -
> > but always try with and without, sometimes it makes things worse by
> making
> > less effective use of the L2 cache.
>
> Thanks for you advice.
>
> I changed all the reads to unsafeReads and all the writes to
> unsafeWrites. That indeed sped up things a bit (about 10 percent on the
> total running time).
>
> I also checked the GC time, but that is (only) 30% of the total running
> time.
>
> So still, the program with ST array is about 3 times slower than the
> program with Data.Map.
>
> Also, the function lookupEq that looks up the states of the equations
> from the array, is responsible for 20% of the running time, and 19% of
> the allocated memory. I would say that is should allocate almost no memory:
>
> lookupEq :: Int -> MyMonad (Maybe EquationState)
> lookupEq cid =
> do s <- get
> mEs <- lift $ unsafeRead s cid
> return mEs
>
> type MyMonad a = forall s2. StateT (Eqns s2) (ST s2) a
> type Eqns s2 = STArray s2 Int (Maybe EquationState)
>
> data EquationState = EQS {cDefinition::Equation, usedBy::Map.Map Int (),
> ...}
Perhaps your monad is not being optimised away? Look at the -ddump-simpl
code for lookupEq to figure out why it is allocating memory.
Cheers,
Simon
More information about the Glasgow-haskell-users
mailing list