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.