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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow