52700.fb2
module Main where
import System.Environment(getArgs)
main = print . sum2 . xs . read =<< fmap head getArgs
where xs n = [1 .. 10 ^ n]
sum2 :: [Int] -> (Int, Int)
sum2 = iter (0, 0)
where iter c
[]
= c
iter c
(x:xs) = iter (tick x c) xs
tick :: Int -> (Int, Int) -> (Int, Int)
tick x (c0, c1) | even x
= (c0, c1 + 1)
| otherwise = (c0 + 1, c1)
Скомпилируем с флагом профилирования:
$ ghc --make leak.hs -rtsopts -prof -auto-all
Статистика вычислителя показывает, что эта программа вызывала глубокую очистку 8 раз и выполняла
полезную работу лишь 40% времени.
$ ./leak 6 +RTS -K30m -sstderr
...
Tot time (elapsed)
Avg pause
Max pause
Gen
0
493 colls,
0 par
0.26s
0.26s
0.0005s
0.0389s
Gen
1
8 colls,
0 par
0.14s
0.20s
0.0248s
0.0836s
...
Productivity
40.5% of total user, 35.6% of total elapsed
Теперь посмотрим на профиль кучи.
168 | Глава 10: Реализация Haskell в GHC
$ ./leak 6 +RTS -K30m -hc
(500000,500000)
$ hp2ps -e80mm -c leak.hp
В первой команде мы добавили флаг hc для того, чтобы создать файл с расширением . hp. Он содержит