Haskell Language
Optimierung
Suche…
Kompilieren Ihres Programms zur Profilerstellung
Der GHC-Compiler bietet eine ausgereifte Unterstützung für das Kompilieren mit Profilierungsanmerkungen.
Durch die Verwendung der -prof und -fprof-auto beim Kompilieren wird Ihrer Binärdatei Unterstützung für die Profilerstellung zur Laufzeit zur Verfügung gestellt.
Angenommen, wir haben dieses Programm:
main = print (fib 30)
fib n = if n < 2 then 1 else fib (n-1) + fib (n-2)
Es so zusammengestellt:
ghc -prof -fprof-auto -rtsopts Main.hs
Dann lief es mit Laufzeitsystemoptionen für das Profiling:
./Main +RTS -p
Es wird eine main.prof Datei nach der Ausführung erstellt (sobald das Programm beendet wurde). main.prof wir alle Arten von Profilierungsinformationen, z. B. Kostenstellen, die uns eine Aufschlüsselung der Kosten für die Ausführung der verschiedenen Teile des Codes geben :
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
Kostenstellen
Kostenstellen sind Anmerkungen zu einem Haskell-Programm, die vom GHC-Compiler automatisch hinzugefügt werden können - mit -fprot-auto - oder von einem Programmierer mit {-# SCC "name" #-} <expression> , wobei "name" steht Ein beliebiger Name und <expression> ist ein beliebiger Haskell-Ausdruck:
-- Main.hs
main :: IO ()
main = do let l = [1..9999999]
print $ {-# SCC "print_list" #-} (length l)
Das Kompilieren mit -fprof und das Ausführen mit +RTS -p z. B. ghc -prof -rtsopts Main.hs && ./Main.hs +RTS -p würde Main.prof erzeugen, wenn das Programm beendet wird.