Haskell Language
оптимизация
Поиск…
Компиляция вашей программы для профилирования
Компилятор GHC имеет зрелую поддержку для компиляции с аннотациями профилирования.
Использование флагов -prof
и -fprof-auto
при компиляции добавит поддержку вашего двоичного -fprof-auto
для флагов профилирования для использования во время выполнения.
Предположим, что у нас есть эта программа:
main = print (fib 30)
fib n = if n < 2 then 1 else fib (n-1) + fib (n-2)
Скомпилировал его так:
ghc -prof -fprof-auto -rtsopts Main.hs
Затем запустили его с параметрами системы времени выполнения для профилирования:
./Main +RTS -p
Мы увидим, что файл main.prof
создал пост-исполнение (после выхода программы), и это даст нам все виды профилирующей информации, такие как МВЗ, которая дает нам разбивку стоимости, связанной с запуском различных частей кода :
Wed Oct 12 16:14 2011 Time and Allocation Profiling Report (Final)
Main +RTS -p -RTS
total time = 0.68 secs (34 ticks @ 20 ms)
total alloc = 204,677,844 bytes (excludes profiling overheads)
COST CENTRE MODULE %time %alloc
fib Main 100.0 100.0
individual inherited
COST CENTRE MODULE no. entries %time %alloc %time %alloc
MAIN MAIN 102 0 0.0 0.0 100.0 100.0
CAF GHC.IO.Handle.FD 128 0 0.0 0.0 0.0 0.0
CAF GHC.IO.Encoding.Iconv 120 0 0.0 0.0 0.0 0.0
CAF GHC.Conc.Signal 110 0 0.0 0.0 0.0 0.0
CAF Main 108 0 0.0 0.0 100.0 100.0
main Main 204 1 0.0 0.0 100.0 100.0
fib Main 205 2692537 100.0 100.0 100.0 100.0
Центры затрат
Центры затрат - это аннотации к программе Haskell, которые могут автоматически добавляться компилятором GHC - с использованием -fprot-auto
- или программистом с использованием {-# SCC "name" #-} <expression>
, где "name" is любое имя, которое вы хотите, и <expression>
- любое действительное выражение Haskell:
-- Main.hs
main :: IO ()
main = do let l = [1..9999999]
print $ {-# SCC "print_list" #-} (length l)
Компиляция с -fprof
и работа с +RTS -p
например, ghc -prof -rtsopts Main.hs && ./Main.hs +RTS -p
будет производить Main.prof
после выхода программы.