2015-09-29 50 views
16

展望*.prof文件中使用+RTS -p生成与启用分析编译,我看到很多这些子例程名为\为什么* .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 

这看上去很神秘,给我。这些代表什么?

回答

17

import Control.Monad 

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

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

然后运行,以下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 

反斜线表明堆栈层,you can set names for each one

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

现在

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 

(新增@trVoldemort评论)

此外,(...)似乎是用于let分配与参与

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 

使用配置文件输出的计算

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

与SCC编译

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 

和输出

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

所以,这些都是没有反斜杠,他们是变相lambda表达式。有趣。 – chi

+1

@chi:甚至没有多少伪装,因为这是我们通常对lambda表达式的语法:)。 –

+2

感谢您的好评。在附注中,我意识到'。(...)'后面的'。/'代表一个带有模式匹配的let语句(这意味着它涉及计算)。例如,当你说'let(a,b)= myFunc'或者'让Just x = lookup ...'等 – trVoldemort