On 03/18/2013 02:14 PM, Gregory Collins wrote:
Put a bang pattern on your accumulator in "go". Since the value is not
demanded until the end of the program, you're actually just building up
a huge space leak there.

Fixed that

Secondly, unconsing from the lazy bytestring will cause a lot of
allocation churn in the garbage collector -- each byte read in the input
forces the creation of a new "L.ByteString", which is many times larger.

Nope. L.ByteString is created along with strict ByteString but content not copied. And, in fact, that not a problem. The problem is that GHC unable to optimize constantly changing state in State monad. I don't know is it posible or not and if it is than what should I do to allow such optimization.

import Control.Monad.State.Strict

data S6 = S6 Int Int

main_6 = do
    let r = evalState go (S6 10000 0)
    print r
  where
    go = do
        (S6 i a) <- get
        if (i == 0) then return a else put (S6 (i - 1) (a + i)) >> go

main_7 = do
    let r = go (S6 10000 0)
    print r
  where
    go (S6 i a)
        | i == 0 = a
        | otherwise = go $ S6 (i - 1) (a + i)

main = main_7

If I run main_6 I get constant allocations. If I run main_7 I get no allocations.

Does anybody know how to overcome this inefficiency?


_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to