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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow