getGCStats only works with +RTS -s
As the below program shows, GHC.Stats.getGCStats
only returns non-zero values for e.g. gc_wall_time
if the program is run with +RTS -s
. I guess that's because the stats aren't tracked by the GC unless you specify +RTS -s
. Are the stats expensive to maintain? If not could we always update these counters?
module Main where
import GHC.Stats
import System.Mem
main = do
print $ let xs = [1..1000000] -- allocation
in fromIntegral (sum xs) / fromIntegral (length xs)
performGC
stats <- getGCStats
putStrLn $ show stats
$ ./Repro
500000.5
GCStats {bytesAllocated = 0, numGcs = 184, maxBytesUsed = 0,
numByteUsageSamples = 0, cumulativeBytesUsed = 0, bytesCopied = 0,
currentBytesUsed = 0, currentBytesSlop = 0, maxBytesSlop = 0,
peakMegabytesAllocated = 63, mutatorCpuSeconds = 9.6468e-2,
mutatorWallSeconds = 0.115874, gcCpuSeconds = 0.0,
gcWallSeconds = 0.0, cpuSeconds = 9.7045e-2, wallSeconds = 0.115874,
parAvgBytesCopied = 0, parMaxBytesCopied = 0}
$ ./Repro +RTS -s
500000.5
GCStats {bytesAllocated = 96086504, numGcs = 184, maxBytesUsed = 27442272,
numByteUsageSamples = 7, cumulativeBytesUsed = 52228768, bytesCopied = 90580024,
currentBytesUsed = 74336, currentBytesSlop = 0, maxBytesSlop = 6803872,
peakMegabytesAllocated = 63, mutatorCpuSeconds = 2.523e-2,
mutatorWallSeconds = 2.5739e-2, gcCpuSeconds = 7.1919e-2,
gcWallSeconds = 9.126e-2, cpuSeconds = 9.7729e-2, wallSeconds = 0.116999,
parAvgBytesCopied = 0, parMaxBytesCopied = 0}
...