Haskell Language
Mejoramiento
Buscar..
Compilando su programa para perfilar
El compilador de GHC tiene un soporte maduro para compilar con anotaciones de perfiles.
El uso de los -prof
y -fprof-auto
al compilar agregará soporte a su binario para los indicadores de perfil para su uso en tiempo de ejecución.
Supongamos que tenemos este programa:
main = print (fib 30)
fib n = if n < 2 then 1 else fib (n-1) + fib (n-2)
Compilado así
ghc -prof -fprof-auto -rtsopts Main.hs
Luego lo ejecutó con las opciones del sistema de tiempo de ejecución para el perfil:
./Main +RTS -p
Veremos un archivo main.prof
creado después de la ejecución (una vez que el programa haya salido), y esto nos dará todo tipo de información de perfiles, como centros de costos, que nos da un desglose del costo asociado con la ejecución de las diversas partes del código. :
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
Centros de costo
Los centros de costos son anotaciones en un programa de Haskell que pueden ser agregados automáticamente por el compilador de GHC - usando -fprot-auto
- o por un programador usando {-# SCC "name" #-} <expression>
, donde "nombre" es cualquier nombre que desee y <expression>
es cualquier expresión de Haskell válida:
-- Main.hs
main :: IO ()
main = do let l = [1..9999999]
print $ {-# SCC "print_list" #-} (length l)
La -fprof
con -fprof
y la ejecución con +RTS -p
por ejemplo, ghc -prof -rtsopts Main.hs && ./Main.hs +RTS -p
producirían Main.prof
una vez que el programa haya salido.