2015-09-29 13 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 टिप्पणी)

इसके अलावा, (...)

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 

शामिल प्रोफ़ाइल उत्पादन के साथ संगणना के साथ let कार्य के लिए इस्तेमाल किया जा रहा है

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

एससीसी 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 

और आउटपुट

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

तो, ये कोई बैकस्लैश हैं के साथ, वे भेष में lambdas हैं। दिलचस्प। – chi

+1

@chi: एक छद्मता का भी अधिक नहीं है क्योंकि यह सिंटैक्स है जिसे हम आम तौर पर लैम्ब्स के लिए रखते हैं :)। –

+2

महान उत्तर के लिए धन्यवाद। एक तरफ ध्यान दें, मुझे एहसास हुआ कि '। (...) 'कुछ के बाद'/'पैटर्न पैटर्न के साथ एक बयान कथन का प्रतिनिधित्व करता है (जिसका अर्थ है कि इसमें गणना शामिल है)। उदाहरण के लिए, जब आप कहते हैं 'चलो (ए, बी) = myFunc' या' बस एक्स = लुकअप ... 'इत्यादि। – trVoldemort

संबंधित मुद्दे