2011-04-02 9 views
8

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

मैं काफी हद तक प्रोफाइलिंग के लिए नया और यह जानना चाहूंगा कि MSDN documentation के माध्यम से प्रदर्शित किए गए हॉट पथ के बारे में मुझे और जानकारी कैसे मिल सकती है;

MSDN उदाहरण:

MSDN Example

मेरे परिणाम:

Hot Path Summary

मैं आउटपुट विंडो में देखा है एक विफलता से संबंधित बहुत से संदेश देखते हैं प्रतीकों को लोड करते समय, उनमें से कुछ नीचे हैं;

Failed to load symbols for C:\Windows\system32\USP10.dll. 
Failed to load symbols for C:\Windows\system32\CRYPTSP.dll. 
Failed to load symbols for (Omitted)\WindowsFormsApplication1\bin\Debug\System.Data.SQLite.dll. 
Failed to load symbols for C:\Windows\system32\GDI32.dll. 
Failed to load symbols for C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.7601.17514_none_41e6975e2bd6f2b2\comctl32.dll. 
Failed to load symbols for C:\Windows\system32\msvcrt.dll. 
Failed to load symbols for C:\Windows\Microsoft.NET\Framework\v4.0.30319\nlssorting.dll. 
Failed to load symbols for C:\Windows\Microsoft.Net\assembly\GAC_32\System.Data\v4.0_4.0.0.0__b77a5c561934e089\System.Data.dll. Failed to load symbols for 
C:\Windows\Microsoft.Net\assembly\GAC_32\System.Transactions\v4.0_4.0.0.0__b77a5c561934e089\System.Transactions.dll. 
Unable to open file to serialize symbols: Error VSP1737: File could not be opened due to sharing violation: - D:\(Omitted)\WindowsFormsApplication1110402.vsp 

किसी भी संकेत दिए गए के लिए धन्यवाद (कोड उपकरण का उपयोग कर तो यह पठनीय है प्रारूपित)।

उत्तर

13

सारांश दृश्य पर दिखाया गया "हॉट पथ" समावेशी नमूने (फ़ंक्शन से नमूने और फ़ंक्शन द्वारा बुलाए गए कार्यों से नमूने) की संख्या के आधार पर सबसे महंगा कॉल पथ है और विशेष नमूने (केवल नमूने से नमूने समारोह)। एक "नमूना" केवल तथ्य है कि फ़ंक्शन स्टैक के शीर्ष पर था जब प्रोफाइलर के चालक ने ढेर पर कब्जा कर लिया था (यह बहुत ही कम समय अंतराल पर होता है)। इस प्रकार, एक समारोह में अधिक नमूने होते हैं, जितना अधिक इसे निष्पादित किया जा रहा था।

नमूना विश्लेषण के लिए डिफ़ॉल्ट रूप से, एक सुविधा बुलाया "जस्ट माई कोड" सक्षम किया गया है कि ढेर गैर उपयोगकर्ता मॉड्यूल से आ रही पर कार्यों को छुपाता है (यह 1 गैर उपयोगकर्ता कार्यों की गहराई दिखाई देगा यदि एक से बुलाया उपयोगकर्ता फ़ंक्शन; आपके मामले में Application.Run)। माइक्रोसॉफ्ट से ज्ञात ज्ञात प्रतीकों के बिना मॉड्यूल से आने वाले कार्यों को बाहर रखा जाएगा। सारांश दृश्य पर आपका "हॉट पथ" इंगित करता है कि सबसे महंगे ढेर में प्रोफाइलर को आपका कोड माना जाता है (Main के अलावा) से कुछ भी नहीं था। एमएसडीएन का उदाहरण अधिक कार्यों को दिखाता है क्योंकि PeopleTrax.* और PeopleNS.* फ़ंक्शन "उपयोगकर्ता कोड" से आ रहे हैं। सारांश दृश्य पर "सभी कोड दिखाएं" लिंक पर क्लिक करके "जस्ट माई कोड" बंद कर दिया जा सकता है, लेकिन मैं यहां ऐसा करने की अनुशंसा नहीं करता।

सारांश दृश्य पर "फ़ंक्शन सबसे व्यक्तिगत कार्य" पर एक नज़र डालें। यह उन कार्यों को प्रदर्शित करता है जिनमें उच्चतम अनन्य नमूना गणना होती है और इसलिए, प्रोफाइलिंग परिदृश्य के आधार पर कॉल करने के लिए सबसे महंगी फ़ंक्शंस हैं। आपको यहां अपने अधिक कार्यों (या अपने कार्यों द्वारा बुलाए गए कार्यों) को देखना चाहिए। इसके अतिरिक्त, "फ़ंक्शंस" और "कॉल ट्री" दृश्य आपको अधिक जानकारी दिखा सकता है (वर्तमान दृश्य का चयन करने के लिए रिपोर्ट के शीर्ष पर एक ड्रॉप-डाउन है)।

आपके प्रतीक चेतावनियों के लिए, उनमें से अधिकतर अपेक्षित हैं क्योंकि वे माइक्रोसॉफ्ट मॉड्यूल हैं (System.Data.SQLite.dll सहित)।जबकि आपको अपनी रिपोर्ट का सही विश्लेषण करने के लिए इन मॉड्यूल के प्रतीकों की आवश्यकता नहीं है, यदि आपने "टूल्स -> विकल्प -> डिबगिंग -> सिंबल" में "माइक्रोसॉफ्ट सिंबल सर्वर" की जांच की है और रिपोर्ट को फिर से खोल दिया है, तो इन मॉड्यूल के लिए प्रतीकों को लोड करना चाहिए । ध्यान दें कि रिपोर्ट को पहली बार खोलने में काफी समय लगेगा क्योंकि प्रतीकों को डाउनलोड और कैश करने की आवश्यकता है।

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

और अंत में, आप उपकरण को अपनी प्रोफाइलिंग सत्र सेटिंग में नमूना देने की बजाय भी कोशिश कर सकते हैं। इंस्ट्रुमेंटेशन मॉड्यूल को संशोधित करता है जिसे आप प्रत्येक फंक्शन कॉल पर डेटा कैप्चर करने के लिए निर्दिष्ट करते हैं (ध्यान रखें कि इसका परिणाम बहुत अधिक हो सकता है .vsp फ़ाइल)। इंस्ट्रुमेंटेशन कोड के विशिष्ट टुकड़ों के समय पर ध्यान केंद्रित करने के लिए आदर्श है, जबकि नमूना सामान्य कम ओवरहेड प्रोफाइलिंग डेटा संग्रह के लिए आदर्श है।

+0

इंस्ट्रुमेंटेशन मैं क्या जरूरत के प्रति अधिक प्रतीत हो रहा है, मैं देख सकता है: वहाँ 8 संभावनाएं हैं प्रत्येक समारोह के अंदर कितना समय बिताया गया था। एक बार फिर धन्यवाद! –

+0

@ पीटर ह्यूएन: विषय से थोड़ी दूर, लेकिन मैं उत्सुक हूं कि एक ही रन में देशी और .NET कोड दोनों के लिए स्रोत कोड कवरेज जानकारी प्राप्त करना संभव है। मेरा मुख्य exe एक मूल .exe है जो .NET dlls – Chubsdad

+0

@Chubsdad का उपयोग करता है: यह है। यदि आप वीएस 2010 या इससे पहले का उपयोग कर रहे हैं, तो आपको वीएसआईएनस्ट्रेट का उपयोग करके देशी और प्रबंधित दोनों निष्पादन योग्य और वीएसपीआरएफएमन का उपयोग करके एकत्रित करने की आवश्यकता है। 2012 में, कोड कवरेज टूल (CodeCoverage.exe) देशी और प्रबंधित निष्पादन योग्य दोनों ऑन-द-फ्लाई (स्मृति में) का वाद्य यंत्र प्रदान करेगा, बशर्ते उनके .pdbs संग्रह समय पर मौजूद हों। –

6

यदि आप प्रोफाइलिंग के बारे में कुछ बात करते हैं, क्या काम करता है और क्या नहीं करता है तो क्या आप बहुत ज्यादा ध्यान देते हैं?

चलो एक कृत्रिम कार्यक्रम तैयार करते हैं, जिनमें से कुछ कथन काम कर रहे हैं जिन्हें अनुकूलित किया जा सकता है - यानी वे वास्तव में आवश्यक नहीं हैं। वे "बाधाएं" हैं।

सबराउटिन foo एक सीपीयू-बाउंड लूप चलाता है जो एक सेकंड लेता है। यह भी मान लें कि सबराउटिन कॉल और रिटर्न निर्देश अन्य सभी की तुलना में महत्वहीन या शून्य समय लेते हैं।

सबराउटिन barfoo 10 बार कॉल करता है, लेकिन उनमें से 9 समय अनावश्यक हैं, जिन्हें आप पहले से नहीं जानते हैं और तब तक नहीं बता सकते हैं जब तक आपका ध्यान निर्देशित नहीं किया जाता है।

सबरूटीन्स A, B, C, ..., J 10 सबरूटीन्स हैं, और वे प्रत्येक कॉल bar एक बार।

शीर्ष-स्तरीय दिनचर्या main प्रत्येक J के माध्यम से प्रत्येक बार कॉल करता है।

तो कुल कॉल पेड़ इस तरह दिखता है:

main 
    A 
    bar 
     foo 
     foo 
     ... total 10 times for 10 seconds 
    B 
    bar 
     foo 
     foo 
     ... 
    ... 
    J 
    ... 
(finished) 

कितना समय सभी लेती है? जाहिर है, 100 सेकंड।

अब प्रोफाइलिंग रणनीतियों को देखें। स्टैक नमूने (जैसे 1000 नमूने कहते हैं) समान अंतराल पर लिया जाता है।

  1. क्या कोई आत्म समय है? हाँ। foo स्वयं समय का 100% लेता है। यह एक वास्तविक "हॉट स्पॉट" है। क्या इससे आपको बाधा मिलती है? नहीं। क्योंकि यह foo में नहीं है।

  2. गर्म पथ क्या है?ठीक है, ढेर नमूने इस तरह दिखेगा:

    मुख्य -> ​​A -> बार -> foo (100 नमूने, या 10%)
    मुख्य -> ​​बी -> बार -> foo (100 नमूने, या 10%)
    ...
    मुख्य -> ​​जम्मू -> बार -> foo (100 नमूने, या 10%)

10 गर्म पथ होते हैं, और उनमें से कोई भी काफी बड़ा आप ज्यादा हासिल करने के लिए लग रही है जल्दी करो।

अगर आपको खुशी मिलती है, और यदि प्रदाता अनुमति देता है, तो आप अपने कॉल पेड़ की "रूट" bar बना सकते हैं। तो फिर तुम इस देखना होगा:

bar -> foo (1000 samples, or 100%) 

तो फिर तुम पता होगा कि foo और bar हर बार की 100% के लिए स्वतंत्र रूप से जिम्मेदार थे और इसलिए स्थानों अनुकूलन के लिए देखने के लिए कर रहे हैं। आप foo पर देखते हैं, लेकिन निश्चित रूप से आप जानते हैं कि समस्या वहां नहीं है। फिर आप bar देखें और आप 10 कॉल foo पर देखते हैं, और आप देखते हैं कि उनमें से 9 अनावश्यक हैं। समस्या सुलझ गयी।

यदि आप अनुमान लगाना नहीं हुआ, और इसके बजाय प्रोफाइलर बस आप प्रत्येक दिनचर्या युक्त नमूनों की प्रतिशत से पता चला है, तो आप इस देखना होगा:

main 100% 
bar 100% 
foo 100% 
A 10% 
B 10% 
... 
J 10% 

कि आपको बताता है, main को देखने के लिए bar, और foo। आप देखते हैं कि main और foo निर्दोष हैं। आप bar पर foo पर कॉल करते हैं और आप समस्या देखते हैं, इसलिए यह हल हो जाता है।

यह भी स्पष्ट है कि यदि आप कार्यों को दिखाने के अलावा, आपको उन रेखाओं को दिखाया जा सकता है जहां कार्यों को बुलाया जाता है। इस तरह, आप समस्या को पा सकते हैं इससे कोई फर्क नहीं पड़ता कि स्रोत टेक्स्ट के संदर्भ में फ़ंक्शन कितने बड़े हैं।

अब, foo बदलें, ताकि यह CPU बाध्य होने के बजाय sleep(oneSecond) बदल सके। यह चीजों को कैसे बदलता है?

इसका मतलब क्या है कि दीवार घड़ी से अभी भी 100 सेकंड लगते हैं, लेकिन CPU समय शून्य है। एक सीपीयू-केवल नमूने में नमूनाकरण कुछ भी नहीं दिखाएगा

तो अब आपको नमूनाकरण के बजाए उपकरण का प्रयास करने के लिए कहा जाता है। यह आपको बताए गए सभी चीजों में शामिल है, यह आपको ऊपर दिखाए गए प्रतिशत भी बताता है, इसलिए इस मामले में आपको समस्या मिल सकती है, मानते हैं कि bar बहुत बड़ा नहीं था। (छोटे कार्यों को लिखने के कारण हो सकते हैं, लेकिन प्रोफाइलर को संतुष्ट करना उनमें से एक होना चाहिए?)

वास्तव में, नमूना के साथ मुख्य बात गलत थी कि यह sleep (या I/O या अन्य के दौरान नमूना नहीं दे सकता अवरुद्ध), और यह आपको कोड लाइन पर्सेंट नहीं दिखाता है, केवल पर्सेंट फंक्शन।

वैसे, 1000 नमूने आपको अच्छी सटीक दिखने वाले पर्सेंट प्रदान करते हैं। मान लें कि आपने कम नमूने लिया है। आपको वास्तव में बाधा खोजने की कितनी जरूरत है? खैर, चूंकि बाधा 9 0% स्टैक पर है, यदि आपने केवल 10 नमूने लिया है, तो यह उनमें से 9 पर होगा, इसलिए आप इसे अभी भी देखेंगे। यदि आपने 3 नमूने भी ले लिए हैं, तो उनमें से दो या अधिक पर होने वाली संभावना 97.2% है।**

उच्च नमूना दरें बाधित होती हैं, जब आपका लक्ष्य बाधाओं को ढूंढना होता है।

वैसे भी, इसलिए मैं random-pausing पर भरोसा करता हूं।

** मुझे 97.2 प्रतिशत कैसे मिला? इसके बारे में सोचें, एक सिक्का को 3 बार फेंकना, एक बहुत ही अनुचित सिक्का, जहां "1" का अर्थ बाधा को देखना है।

 #1s probabality 
0 0 0 0 0.1^3 * 0.9^0 = 0.001 
0 0 1 1 0.1^2 * 0.9^1 = 0.009 
0 1 0 1 0.1^2 * 0.9^1 = 0.009 
0 1 1 2 0.1^1 * 0.9^2 = 0.081 
1 0 0 1 0.1^2 * 0.9^1 = 0.009 
1 0 1 2 0.1^1 * 0.9^2 = 0.081 
1 1 0 2 0.1^1 * 0.9^2 = 0.081 
1 1 1 3 0.1^0 * 0.9^3 = 0.729 

तो यह 2 या 3 बार देखकर की संभावना 0.081 * 3 + 0.729 = बिल्कुल .972

+0

महान जानकारी, धन्यवाद! :) –

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