weigh (https://www.fpcomplete.com/blog/2016/05/weigh-package) is a library measures how much allocation evaluating a function causes. It's basically a nice interface to GHC.Stats.getGCStats.
Here is an example that measures \n -> n+1:
import Weigh
main :: IO ()
main = mainWith (func "+1" plusOne 5)
plusOne :: Int -> Int
plusOne = \n -> n + 1
which prints
Case Bytes GCs Check
+1 16 0 OK
when run (64 bit machine; allocating 1 Int = 16 bytes).
So my question is, what about the thunk allocated by (+)? My rough understanding of the heap is this:
Code Heap
---- ----
1 1 1 1 1
plusOne 1 +-------+----------+----+ +----+---+
| THUNK | reserved | --|--> | I# | 5 |
+-------+----------+----+ +----+---+
1 1 1 1 1
deepseq it +-------+----------+----+ +----+---+
| IND | | --|--> | I# | 5 |
+-------+-----|----+----+ +----+---+
| 1 1
`------------> +----+---+
| I# | 6 |
+----+---+
1 1
GC +----+---+
| I# | 6 |
+----+---+
So haven't we allocated 5 bytes, not two? Three for the GC'd thunk, and two for the new Int?
Any clarification or pointers (heh) to some GHC reading would be greatly appreciated!
Thanks,
Mitchell