2015-09-29 56 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