52700.fb2 Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 185

Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 185

грамму:

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