[Haskell-cafe] Space leaks in function that uses Data.Vector.Mutable

Andrey Yankin yankin013 at gmail.com
Wed Jan 23 22:08:28 CET 2013


I have a "low-level" function for insertion element into mutable vector. It
looks like this:

place :: (PrimMonad m) =>
     MV.MVector (PrimState m) (Int, t) -> (Int, t) -> Int -> m ()
place v max@(val1,_) i = place' i
  place' i = do
    let j = i - 1
    if j < 0
    then return ()
    else do
      curr@(val2, _) <- MV.unsafeRead v j  -- <<<<<
      if val2 > val1
      then do
        MV.unsafeWrite v j max
        MV.unsafeWrite v i curr
        place' j
      else return ()

It searches a right place for the i-th element, moving it towards beginning
. Surprisingly, it works, but is slow.

Time profiling says this:
COST CENTRE     MODULE  %time %alloc  ticks     bytes

place.place'    Main     40.1   77.1   9167 12169223232

And heap profiling says that most of allocations are for Int and (,).

I think, binding of unsafeRead to curr and val might allocate my Precious
memory more than, maybe, it is needed.

Am I right? Is it some strictness that I need? Is there anything I can do
in this situation? Or should I look outside of this function?

PS Emergence of this piece of code is a long story. Originally I was trying
to solve Project Euler's problem 411. But now it is a different issue.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20130124/1780d2f9/attachment.htm>

More information about the Haskell-Cafe mailing list