
2011/11/15 Johan Tibell
On Tue, Nov 15, 2011 at 12:08 PM, Jason Dusek
wrote: Should I be annotating my functions with strictness, for the vector reference, for example? Should I be using STUArrays, instead?
From http://www.haskell.org/ghc/docs/latest/html/libraries/base-4.4.1.0/Control-M...
"The >>= and >> operations are strict in the state (though not in values stored in the state)."
which implies that
modifySTRef counter (+1)
is too lazy.
As a first cut at strictifying the ST operations, I introduced a strict plus and strict vector write operation, strictifying every parameter that admitted it. (+!) a b = ((+) $!! a) $!! b w v n b = (Vector.unsafeWrite v $!! n) $!! b This did not alter memory usage in any noticeable way. (Tried it with strict and lazy ByteStrings and both had the same memory usage as they did without the extra strictness.) It does seem off odd that building a vector byte by byte is so hard to do performantly. Maybe the memory usage ends up being okay when working with larger structures, though. -- Jason Dusek () ascii ribbon campaign - against html e-mail /\ www.asciiribbon.org - against proprietary attachments diff --git a/Rebuild.hs b/Rebuild.hs @@ -15,6 +15,7 @@ import Data.STRef import Data.String import Data.Word +import Control.DeepSeq import Data.Vector.Unboxed (Vector) import qualified Data.Vector.Unboxed as Vector (create, length) import qualified Data.Vector.Unboxed.Mutable as Vector hiding (length) @@ -46,8 +47,8 @@ rebuildAsVector bytes = byteVector n <- readSTRef counter return (Vector.unsafeSlice 0 n v) writeOneByte v counter b = do n <- readSTRef counter - Vector.unsafeWrite v n b + w v n b modifySTRef counter (+!1) + (+!) a b = ((+) $!! a) $!! b + w v n b = (Vector.unsafeWrite v $!! n) $!! b