2015-09-29 20 views
16

Guardando nel file *.prof generato usando +RTS -p con la compilazione profiling abilitato, vedo un sacco di questi sub-routine che prende il nome \:Perché ci sono così tanti backslash () nel file * .prof?

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 

che sembra criptico per me. Cosa rappresentano?

risposta

17

Let

import Control.Monad 

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

e correre con

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

allora, seguendo 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 

le barre inverse mostrano che il livello di stack, you can set names for each one

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

e ora

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 

(Aggiunto @trVoldemort commento)

Inoltre, (...) sembra essere usato per let assegnazioni con i calcoli coinvolti

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 

con uscita profilo

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

con 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 

e l'uscita

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

Quindi, questi sono barre rovesciate, sono lambda sotto mentite spoglie. Interessante. – chi

+1

@chi: Nemmeno un travestimento dato che questa è la sintassi che normalmente abbiamo per lambda :). –

+2

Grazie per l'ottima risposta. In una nota a margine, mi sono reso conto che il '. (...)' dopo alcuni '. /' Rappresenta un'istruzione let con la corrispondenza del modello (il che significa che implica il calcolo). Ad esempio, quando dici 'let (a, b) = myFunc' o' let Just x = lookup ... 'ecc. – trVoldemort

Problemi correlati