
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?