Haskell Language
optimalisatie
Zoeken…
Uw programma compileren voor profilering
De GHC-compiler heeft volwassen ondersteuning voor het compileren met profileringsannotaties.
Als u bij het compileren de vlaggen -prof
en -fprof-auto
, voegt u ondersteuning toe aan uw binary voor het profileren van vlaggen voor gebruik tijdens runtime.
Stel dat we dit programma hebben:
main = print (fib 30)
fib n = if n < 2 then 1 else fib (n-1) + fib (n-2)
Zo samengesteld:
ghc -prof -fprof-auto -rtsopts Main.hs
Vervolgens werd het uitgevoerd met runtime-systeemopties voor profilering:
./Main +RTS -p
We zullen een main.prof
bestand zien dat na de uitvoering is gemaakt (zodra het programma is afgesloten), en dit geeft ons allerlei profileringsinformatie, zoals kostenplaatsen, die ons een overzicht geven van de kosten die zijn verbonden aan het uitvoeren van de verschillende delen van de code :
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
Kostenplaatsen
Kostenplaatsen zijn annotaties op een Haskell-programma die automatisch kunnen worden toegevoegd door de GHC-compiler - met behulp van -fprot-auto
- of door een programmeur met behulp van {-# SCC "name" #-} <expression>
, waarbij "naam" is elke gewenste naam en <expression>
is een geldige Haskell-expressie:
-- Main.hs
main :: IO ()
main = do let l = [1..9999999]
print $ {-# SCC "print_list" #-} (length l)
Compileren met -fprof
en uitvoeren met +RTS -p
bijv. ghc -prof -rtsopts Main.hs && ./Main.hs +RTS -p
zou Main.prof
produceren zodra het programma is afgesloten.