2015-09-29 14 views
16

Patrząc w pliku *.prof generowane przy użyciu +RTS -p z profilowania włączony kompilacji, widzę wiele z tych sub-rutyny, że nazwie \:Dlaczego w pliku * .prof jest tyle odwróconych ukośników ()?

COST CENTRE   MODULE       %time %alloc 

main.\.\.\   Main       74.1 85.8 
unstreamChunks/inner Data.Text.Internal.Lazy.Fusion 11.9 8.6 
inverseLetters.\  Main        4.5 1.7 
main.\.\.\.(...)  Main        2.9 1.0 
main.\.\.\.(...)  Main        2.8 1.0 
unstreamChunks/resize Data.Text.Internal.Lazy.Fusion 1.2 0.8 
unstreamChunks/outer Data.Text.Internal.Lazy.Fusion 1.1 0.5 

który wygląda tajemnicze dla mnie. Co one reprezentują?

Odpowiedz

17

Niech

import Control.Monad 

main = do 
    forM_ [1..1000] $ \i -> 
     if mod i 2 == 0 then putStrLn "Foo" 
         else print i 

i biegać z

ghc -rtsopts -prof -fprof-auto z.hs && ./z +RTS -p && cat z.prof 

Następnie, po rules to set cost centres

COST CENTRE MODULE   %time %alloc 
main.\  Main    80.0 84.4 
main  Main    20.0 13.2 
CAF   GHC.IO.Handle.FD 0.0 2.1 

ukośniki pokazują, że poziom stosu, you can set names for each one

forM_ [1..1000] $ \i -> 
    {-# SCC "myBranch" #-} 
    if mod i 2 == 0 then putStrLn "Foo" 
        else print i 

i teraz

COST CENTRE MODULE   %time %alloc 
myBranch Main    90.0 84.4 
main  Main    10.0 13.2 
CAF   GHC.IO.Handle.FD 0.0 2.1 

(Dodane @trVoldemort komentarz)

Również (...) wydaje się być wykorzystywane do let zadań z obliczeń związanych

data T = T Int (IO()) (IO()) 
main = 
    forM_ [T (mod i 2) (putStrLn "Foo") (print i) | i <- [1..1000]] $ \q -> 
     let T a b c = q -- Will be `(...)` 
     in if a == 0 then b else c 

z wyjściem profilu

main.\  Main 
main.\.b  Main 
main.\.c  Main 
main.\.(...) Main 
main.\.a  Main 

z SCC Pragma

forM_ [T (mod i 2) (putStrLn "Foo") (print i) | i <- [1..1000]] $ \q -> 
    let T a b c = {-# SCC "myBind" #-} q 
    in if a == 0 then b else c 

i wyjście

main.\.b  Main 
main.\.c  Main 
main.\.(...) Main 
myBind  Main 
main.\.a  Main 
+7

Więc nie są to backslashy, są lambdas w przebraniu. Ciekawy. – chi

+1

@chi: To nie jest zwykłe przebranie, ponieważ taka jest składnia lambdas :). –

+2

Dzięki za wspaniałą odpowiedź. Na marginesie zdałem sobie sprawę, że '. (...)' po niektórych '. /' Reprezentuje instrukcję let z dopasowaniem wzorca (co oznacza, że ​​wymaga obliczeń). Na przykład, gdy powiesz 'let (a, b) = myFunc' lub' let Just x = lookup ... 'itd. – trVoldemort

Powiązane problemy