52700.fb2
166 | Глава 10: Реализация Haskell в GHC
module Main where
concatR = foldr (++) []
concatL = foldl (++) []
fun :: Double
fun = test concatL - test concatR
where test f = last $ f $ map return [1 .. 1e6]
main = print fun
У нас есть подозрение, что какая-то из двух функций concatX работает слишком медленно. Мы можем
посмотреть какая, если добавим к ним специальную прагму SCC:
concatR = {-# SCC ”right” #-} foldr (++) []
concatL = {-# SCC ”left”
#-} foldl (++) []
Напомню, что прагмой называется специальный блочный комментарий с решёткой. Это специальное со-
общение компилятору. Прагмой SCC мы устанавливаем так называемый центр затрат (cost center). Она пи-
шется сразу за знаком равно. В кавычках пишется имя, под которым статиситика войдёт в итоговый отчёт.
После этого вычислитель будет следить за нагрузкой, которая приходится на эту функцию. Теперь нам нужно
скомпилировать модуль с флагом prof, который активирует подсчёт статистики в центрах затрат:
$ ghc --make concat.hs -rtsopts -prof -fforce-recomp
$ ./concat +RTS -p
Второй командой мы запускаем программу и передаём вычислителю флаг p. После этого будет создан
файл concat. prof. Откроем этот файл:
concat +RTS -p -RTS
total time
=
1.45 secs
(1454 ticks @ 1000 us, 1 processor)
total alloc = 1,403,506,324 bytes
(excludes profiling overheads)
COST CENTRE MODULE
%time %alloc
left
Main
99.8
99.8
individual
inherited
COST CENTRE MODULE
no.
entries
%time %alloc
%time %alloc
MAIN
MAIN
46
0
0.0
0.0
100.0