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

मैं प्रोफाइलिंग के लिए बिल्कुल नया हूं और जानना चाहता हूं कि मैं हॉट पाथ के बारे में अधिक जानकारी कैसे प्राप्त कर सकता हूं जैसा कि 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

(कोड टूल का उपयोग करके फ़ॉर्मेट किया गया ताकि यह पठनीय हो)

किसी भी संकेत के लिए धन्यवाद।

8
Jamie Keeling 3 अप्रैल 2011, 00:48

2 जवाब

सबसे बढ़िया उत्तर

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

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

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

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

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

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

13
Peter Huene 3 अप्रैल 2011, 03:22
मुझे जो चाहिए वह इंस्ट्रुमेंटेशन अधिक लगता है, मैं देख सकता हूं कि प्रत्येक समारोह के अंदर कितना समय बिताया गया था। एक बार फिर धन्यवाद!
 – 
Jamie Keeling
14 अप्रैल 2011, 17:02
ह्यूएन: विषय से थोड़ा हटकर, लेकिन मैं उत्सुक हूं कि क्या एक ही बार में देशी और .net कोड दोनों के लिए स्रोत कोड कवरेज जानकारी प्राप्त करना संभव है। मेरा मुख्य exe एक देशी .exe है जो .net dlls का उपयोग करता है
 – 
Chubsdad
24 सितंबर 2013, 10:47
@Chubsdad: यह है। यदि आप वीएस 2010 या उससे पहले का उपयोग कर रहे हैं, तो आपको वीएसआईएनस्ट्र का उपयोग करके प्रत्येक निष्पादन योग्य, दोनों मूल और प्रबंधित करने की आवश्यकता है और वीएसपीआरएफमोन का उपयोग करके एकत्र करना होगा। 2012 में, कोड कवरेज टूल (CodeCoverage.exe) ऑन-द-फ्लाई (मेमोरी में) देशी और प्रबंधित निष्पादन योग्य दोनों का साधन होगा, बशर्ते उनके .pdb संग्रह के समय मौजूद हों।
 – 
Peter Huene
24 सितंबर 2013, 20:55

अगर मैं प्रोफाइलिंग के बारे में थोड़ी बात करूं, तो क्या काम करता है और क्या नहीं, क्या आपको बहुत बुरा लगता है?

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

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

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

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

शीर्ष-स्तरीय दिनचर्या main प्रत्येक A से 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. गर्म मार्ग क्या है? खैर, ढेर के नमूने इस तरह दिखते हैं:

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

10 गर्म रास्ते हैं, और उनमें से कोई भी इतना बड़ा नहीं दिखता है कि आपको अधिक गति प्रदान कर सके।

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

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

तब आपको पता चलेगा कि foo और bar 100% समय के लिए स्वतंत्र रूप से जिम्मेदार थे और इसलिए अनुकूलन की तलाश करने के लिए स्थान हैं। आप foo को देखते हैं, लेकिन निश्चित रूप से आप जानते हैं कि समस्या वहां नहीं है। फिर आप bar को देखते हैं और आप foo को 10 कॉल देखते हैं, और आप देखते हैं कि उनमें से 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 नमूने आपको सटीक दिखने वाले अच्छे प्रतिशत देते हैं। मान लीजिए आपने कम नमूने लिए। बाधा खोजने के लिए आपको वास्तव में कितने की आवश्यकता है? ठीक है, चूंकि 90% समय में अड़चन स्टैक पर है, यदि आपने केवल 10 नमूने लिए हैं, तो यह उनमें से लगभग 9 पर होगा, इसलिए आप इसे अभी भी देखेंगे। यदि आपने कम से कम 3 नमूने लिए हैं, तो दो या अधिक नमूनों पर इसके प्रकट होने की प्रायिकता 97.2% है।**

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

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

** मुझे 97.2 प्रतिशत कैसे मिला? इसे एक सिक्के को 3 बार उछालने के रूप में सोचें, एक बहुत ही अनुचित सिक्का, जहाँ "1" का अर्थ है अड़चन देखना। 8 संभावनाएं हैं:

       #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 बार देखने की प्रायिकता है .081*3 + .729 = .972

6
Community 23 मई 2017, 14:48