2015-05-13 7 views
12

मैं -prof के साथ संकलित करके अपने हास्केल प्रोग्राम में अनुकूलन अवसरों की तलाश में हूं, लेकिन मुझे नहीं पता कि इलिप्स वाले लागत केंद्रों की व्याख्या कैसे करें। filter.(...) और jankRoulette.select.(...) क्या हैं?क्या करता है। (...) .prof रिपोर्ट में मतलब है?

COST CENTRE    MODULE      %time %alloc 

filter.(...)    Forest      46.5 22.3 
set-union     Forest      22.5 4.1 
cache-lookup    Forest      16.0 0.1 
removeMany     MultiMapSet     3.7 1.9 
insertMany     MultiMapSet     3.3 1.8 
jankRoulette.select.(...) Forest      1.4 15.2 

मैं उत्पन्न उस के साथ:

filter a b = blahblah where 
    foo = bar 
    bar = baz 
    baz = bing 

लेकिन उन सभी को दिखाने के रूप में filter.foo, filter.bar, आदि: $ ghc --make -rtsopts -prof -auto-all main.hs && ./main +RTS -p && cat main.prof

समारोह filter एक where खंड में कुछ परिभाषाओं, इस तरह है

मैंने सोचा कि उन्हें अभिव्यक्तियों को घोंसला दिया जा सकता है, लेकिन jankRoulette.select में कोई नहीं है। और मैंने उनमें से अधिकतर के सामने एससीसी निर्देश जोड़े हैं, बिना किसी भी लागत केंद्र शीर्ष पर बढ़ रहे हैं।

चूंकि अधिकांश समय filter.(...) में बिताया जाता है, मैं जानना चाहता हूं कि यह क्या है। :)

+1

कोड बेनोफ कोट्स में 'TODO' टिप्पणी के रूप में सुझाव देना चाहिए, जीएचसी प्रोफाइलर रिपोर्ट (और कंपाइलर आउटपुट में बहुत कुछ भी) हमेशा' ghc --version' के परिणाम के साथ होना चाहिए। – dfeuer

+0

अनुस्मारक के लिए धन्यवाद! वंशावली के लिए, मैं शानदार ग्लासगो हास्केल संकलन प्रणाली, संस्करण 7.8.1 चला रहा हूं। – alltom

उत्तर

7

टीएल; डीआर: जीएचसी इसे उत्पन्न करता है जब आप एक बाध्यकारी में पैटर्न मिलान करते हैं, जैसे let (x,y) = cc का मूल्यांकन करने की लागत ... लागत केंद्र द्वारा ट्रैक की जाती है (क्योंकि इसमें कोई अनोखा नाम नहीं है)।


तो मुझे यह कैसे पता चला? GHC स्रोत कोड में (...) के लिए एक ग्रेप निम्नलिखित पाता है (संकलक/deSugar/Coverage.hs से):

-- TODO: Revisit this 
addTickLHsBind (L pos ([email protected](PatBind { pat_lhs = lhs, pat_rhs = rhs }))) = do 
    let name = "(...)" 
    (fvs, rhs') <- getFreeVars $ addPathEntry name $ addTickGRHSs False False rhs 

    {- ... more code following, but not relevant to this purpose 
    -} 

कि कोड हमें बताता है यह पैटर्न बाइंडिंग के साथ कुछ करने के लिए है। तो हम एक छोटे से परीक्षण कार्यक्रम व्यवहार की जांच करने के लिए कर सकते हैं:

x :: Int 
(x:_) = reverse [1..1000000000] 

main :: IO() 
main = print x 

फिर, हम सक्षम रूपरेखा के साथ इस कार्यक्रम चला सकते हैं। एक वास्तव में, GHC निम्नलिखित उत्पादन उत्पन्न करता है:

COST CENTRE MODULE     no.  entries %time %alloc %time 

%alloc 
MAIN  MAIN      42   0 0.0 0.0 100.0 100.0 
CAF  Main      83   0 0.0 0.0 100.0 100.0 
    (...)  Main      86   1 100.0 100.0 100.0 100.0 
    x   Main      85   1 0.0 0.0  0.0 0.0 
    main  Main      84   1 0.0 0.0  0.0 0.0 

तो यह धारणा कोड से बने सही था पता चला है। कार्यक्रम के हर समय reverse [1..1000000000] अभिव्यक्ति का मूल्यांकन करने में व्यतीत किया जाता है, और इसे (...) लागत केंद्र को सौंपा गया है।

+0

मुझे वहां 'TODO' टिप्पणी पसंद है (और पूरी तरह से सहानुभूति): पी। –

+0

अनुशासनिक: लागत केंद्रों को असंबद्ध करने के लिए, पैटर्न-मिलान से पहले मानों का नाम दें, जैसे '(x: _) = foo जहां foo = reverse [1..10000000] '। महान जवाब, बेनोफ, एक टन धन्यवाद! – alltom

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