Haskell Language
Optimering
Sök…
Utarbeta ditt program för profilering
GHC-kompilatorn har moget stöd för kompilering med profilerande kommentarer.
Att använda -prof
och -fprof-auto
vid sammanställning kommer att ge stöd till din binär för att profilera flaggor för användning vid körning.
Anta att vi har det här programmet:
main = print (fib 30)
fib n = if n < 2 then 1 else fib (n-1) + fib (n-2)
Samlade det så:
ghc -prof -fprof-auto -rtsopts Main.hs
Sedan körde det med runtime systemalternativ för profilering:
./Main +RTS -p
Vi kommer att se en main.prof
fil skapad efter exekvering (när programmet har gått ut), och detta kommer att ge oss alla typer av profileringsinformation, t.ex. :
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
Kostnadscentra
Kostnadscentra är anteckningar på ett Haskell-program som kan läggas till automatiskt av GHC-kompilatorn - med -fprot-auto
- eller av en programmerare som använder {-# SCC "name" #-} <expression>
, där "namn" är vilket namn du vill och <expression>
är något giltigt Haskell-uttryck:
-- Main.hs
main :: IO ()
main = do let l = [1..9999999]
print $ {-# SCC "print_list" #-} (length l)
Om du kompilerar med -fprof
och kör med +RTS -p
t.ex. ghc -prof -rtsopts Main.hs && ./Main.hs +RTS -p
skulle producera Main.prof
när programmet har gått ut.