Basically, I have a simple function call, which when used in conjunction with Criterion , the results of memory consumption exploded.
Suppose I have the following program:
{-# OPTIONS_GHC -fno-cse #-}
{-# LANGUAGE BangPatterns #-}
module Main where
import Criterion.Main
import Data.List
num :: Int
num = 10000000
lst :: a -> [Int]
lst _ = [1,2..num]
myadd :: Int -> Int -> Int
myadd !x !y = let !result = x + y in
result
mysum = foldl' myadd 0
main :: IO ()
main = do
print $ mysum (lst ())
Then this program (compiled using O0) works fine, without exploding memory.
If we use cabal build -vto compile a command compilation dump, and then the tag -ddump-simpl -fforce-recomp -O0 -dsuppress-all(the statement proposed by IO / Monadic that assigns ghci to explode for an infinite list ) to the end of the command ghc --make -no-link ..., we get the following kernel:
num
num = I
lst
lst = \ @ a_a3Yn _ -> enumFromThenTo $fEnumInt (I
myadd
myadd =
\ x_a3Cx y_a3Cy ->
case x_a3Cx of x1_X3CC { I
case y_a3Cy of y1_X3CE { I
+ $fNumInt x1_X3CC y1_X3CE
}
}
mysum
mysum = foldl' myadd (I
main
main =
print
$fShowInt (mysum (enumFromThenTo $fEnumInt (I
main
main = runMainIO main
, CAF ,
, . ,
, 1.1.0.0:
{-# OPTIONS_GHC -fno-cse #-}
{-# LANGUAGE BangPatterns #-}
module Main where
import Criterion.Main
import Data.List
num :: Int
num = 10000000
lst :: a -> [Int]
lst _ = [1,2..num]
myadd :: Int -> Int -> Int
myadd !x !y = let !result = x + y in
result
mysum = foldl' myadd 0
main :: IO ()
main = defaultMain [
bgroup "summation"
[bench "mysum" $ whnf mysum (lst ())]
]
.
:
num
num = I
lst
lst = \ @ a_a3UV _ -> enumFromThenTo $fEnumInt (I
myadd
myadd =
\ x_a3Cx y_a3Cy ->
case x_a3Cx of x1_X3CC { I
case y_a3Cy of y1_X3CE { I
+ $fNumInt x1_X3CC y1_X3CE
}
}
mysum
mysum = foldl' myadd (I
main
main =
defaultMain
(: (bgroup
(unpackCString
(: (bench
(unpackCString
(whnf mysum (enumFromThenTo $fEnumInt (I
([])))
([]))
main
main = runMainIO main
, CAF .
, , ,
? GHC 7.8.3