Haskell Language
Ottimizzazione
Ricerca…
Compilare il tuo programma per il profiling
Il compilatore GHC ha un supporto maturo per la compilazione di annotazioni di profilazione.
L'uso dei -prof
e -fprof-auto
durante la compilazione aggiungerà il supporto al tuo binario per i flag di profiling da utilizzare in fase di runtime.
Supponiamo di avere questo programma:
main = print (fib 30)
fib n = if n < 2 then 1 else fib (n-1) + fib (n-2)
Compilato in questo modo:
ghc -prof -fprof-auto -rtsopts Main.hs
Quindi lo eseguiva con le opzioni di sistema di runtime per la profilazione:
./Main +RTS -p
Vedremo un file main.prof
creato dopo l'esecuzione (una volta che il programma è uscito), e questo ci darà tutti i tipi di informazioni di profilazione come i centri di costo che ci forniscono una ripartizione del costo associato all'esecuzione delle varie parti del codice :
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
Centri di costo
I centri di costo sono annotazioni su un programma Haskell che può essere aggiunto automaticamente dal compilatore GHC - usando -fprot-auto
- o da un programmatore che usa {-# SCC "name" #-} <expression>
, dove "nome" è qualsiasi nome tu desideri e <expression>
è qualsiasi espressione Haskell valida:
-- Main.hs
main :: IO ()
main = do let l = [1..9999999]
print $ {-# SCC "print_list" #-} (length l)
Compilando con -fprof
e correndo con +RTS -p
eg ghc -prof -rtsopts Main.hs && ./Main.hs +RTS -p
produrrebbe Main.prof
una volta che il programma è terminato.