2011-11-01 13 views
14

कोई भी अच्छा F # समर्थन के साथ प्रदर्शन प्रोफाइलिंग टूल की अनुशंसा कर सकता है?अच्छा एफ # प्रदर्शन प्रोफाइलिंग टूल

मैं विजुअल स्टूडियो 2010 प्रोफाइलर का उपयोग कर रहा हूं लेकिन मुझे F # का उपयोग करते समय कुछ समस्याएं मिली हैं। ऐसा लगता है कि मैं मूल एफ # की तुलना में प्रतिबिंब के बाद बाइट कोड प्रोफाइल कर रहा हूं।

let Add a b = 
    a + b 

let Add1 = Add 1 

let rec MultiAdd count = 
    match count with 
    | 1 -> 1 
    | _ -> (Add1 1) + (MultiAdd (count - 1)) 

MultiAdd 10000 |> ignore 

मैं निम्नलिखित कॉल पेड़ मिलती है::

उदाहरण के लिए जब निम्न थोड़ा काल्पनिक उदाहरण रूपरेखा

CallTree

जब मैं Microsoft.FSharp.Core.FSharpFunc`2 देखने। फंक्शन विवरण में (0) को आमंत्रित करें I देखें: Function Details

मैं समझता हूं कि क्या मैं देख रहा हूं संकलित कोड के अंतर्निहित कार्यान्वयन पर आधारित है और हालांकि मैं इसका अनुसरण कर सकता हूं, यह मुश्किल है।

क्या किसी को F # के साथ अन्य प्रोफाइलिंग टूल का उपयोग करने का अनुभव है और क्या वे मूल F # कोड पर मैपिंग का बेहतर काम करते हैं?

+0

आप सीपीयू नमूने के बजाय समारोह कॉल पर उपकरण के लिए विकल्प की कोशिश की है? – gradbot

उत्तर

6

मेरा उत्तर आपको निराश कर सकता है, लेकिन यह सहायक हो सकता है।

कुछ महीने पहले, मैंने अपने F # प्रोजेक्ट के लिए एक अच्छा मुफ्त .NET प्रोफाइलर खोजने का प्रयास किया। nprof, slimtune, EQATEC और (हाल ही में वाणिज्यिक) Xte profiler के साथ मेरा अनुभव बिल्कुल सभ्य नहीं था। मैंने पाया कि एफ # के लिए उनका समर्थन बहुत सीमित था, और उसे विजुअल स्टूडियो 2010 प्रोफाइलर पर वापस जाना पड़ा। मुझे लगता है कि यहां आपकी सबसे अच्छी शर्त कुछ वाणिज्यिक प्रोफाइलर है (जिसका मुझे कोई अनुभव नहीं है)।

कुछ समय बाद, मैं प्रोफाइलर के लिए उपयोग करता हूं और परिणामों की इसकी प्रस्तुति को आसान, स्पष्ट और समझा जा सकता हूं। यदि आप समानांतर प्रोग्राम अनुकूलित कर रहे थे, तो समवर्ती विजुअलाइज़र का उपयोग करना अपरिहार्य होगा। उस ने कहा कि आप जिस चीज की देखभाल करते हैं वह प्रदर्शन है; वीएस 2010 प्रोफाइलर के साथ अच्छी तरह से चलना कोशिश करने लायक है।

एफ # कोड प्रोफाइलिंग के लिए, मुझे CLR Profiler और ILSpy का उल्लेख करने के लायक भी मिलते हैं। यदि आप स्मृति आवंटन या कचरा संग्रह को न्यूनतम करना चाहते हैं तो पूर्व ढेर को कल्पना कर सकते हैं। उत्तरार्द्ध आईएल या सी # में समकक्ष कोड उत्पन्न कर सकता है (जिसे मैं एफ # से अधिक परिचित हूं); यह समझने में सहायता कर सकता है कि उन्हें उचित रूप से उपयोग करने के लिए एफ # कार्य में उच्च-आदेश कैसे बनाया जाता है।

अद्यतन:

डेव थॉमस an excellent blog post लिखा है, जहां वह कई वाणिज्यिक प्रोफाइलर इस्तेमाल किया मेमोरी लीक और धुन एक अतुल्यकालिक आवेदन पता लगाने के लिए। उन प्रोफाइलरों पर एक नज़र डालें; वे आपकी वरीयता के अनुरूप हो सकते हैं।

+2

उल्लेख के लिए धन्यवाद! मुख्य समस्या एफ # प्रकारों पर वापस नामों का मानचित्रण कर रही है, http://www.jetbrains.com/profiler/ के मूल्यांकन की जांच करें यदि 'कोड की रेखा' विकल्प है जो आपको अपमानजनक रेखा – 7sharp9

+0

पर प्रोफ़ाइल करने की अनुमति देता है आप किसी भी उपकरण के बारे में जानते हैं जो मैक पर काम करेगा? – czifro

4

यह डीबग मोड में आपकी प्रोफाइलिंग की तरह लगता है। आपको प्रोजेक्ट -> गुण -> बिल्ड मेनू से "अनुकूलित कोड" सक्षम करने की आवश्यकता है। आप रिलीज मोड में भी प्रोफाइल कर सकते हैं जिसने इसे डिफ़ॉल्ट रूप से सक्षम किया है। यदि आप नहीं करते हैं तो अन्य चीजों के साथ बहुत सारे कॉल कॉल और टुपल ऑब्जेक्ट सृजन होंगे।

उपरोक्त मल्टीएड फ़ंक्शन पूंछ रिकर्सिव नहीं है। यदि ऐसा होता है, तो आपको प्रोफाइलिंग के लिए डीबग मोड में "पूंछ कॉल जेनरेट" करने की भी आवश्यकता होगी।

enter image description here

यह भी पूंछ कॉल अनुकूलन के लिए एक अच्छा मामला होगा।

let Add a b = 
    a + b 

let Add1 = Add 1 

let rec MultiAdd total count = 
    match count with 
    | 1 -> 1 + total 
    | _ -> MultiAdd (count - 1) (total + Add1 1) 

MultiAdd 10000 0 |> ignore 

enter image description here

+0

मैंने इसे रिलीज़ मोड में चलाने की कोशिश की और सुनिश्चित किया कि "अनुकूलित कोड" चेक किया गया है लेकिन फिर भी वही परिणाम मिला है। क्या मैं कुछ भूल रहा हूँ? –

+2

@ किथहैरिसन इनवॉक कॉल इस मामले में नहीं चलेगा क्योंकि यह फ़ंक्शन पूंछ रिकर्सिव नहीं है। मैंने जोड़ा पूंछ कॉल संस्करण आज़माएं। डीबगर में शोर में कमी का फ़िल्टर भी होता है। आप इसे% समय से नीचे कॉल को अनदेखा करने के लिए सेट कर सकते हैं। – gradbot

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