यदि आप प्रोफाइलिंग के बारे में कुछ बात करते हैं, क्या काम करता है और क्या नहीं करता है तो क्या आप बहुत ज्यादा ध्यान देते हैं?
चलो एक कृत्रिम कार्यक्रम तैयार करते हैं, जिनमें से कुछ कथन काम कर रहे हैं जिन्हें अनुकूलित किया जा सकता है - यानी वे वास्तव में आवश्यक नहीं हैं। वे "बाधाएं" हैं।
सबराउटिन foo
एक सीपीयू-बाउंड लूप चलाता है जो एक सेकंड लेता है। यह भी मान लें कि सबराउटिन कॉल और रिटर्न निर्देश अन्य सभी की तुलना में महत्वहीन या शून्य समय लेते हैं।
सबराउटिन bar
foo
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 नमूने कहते हैं) समान अंतराल पर लिया जाता है।
क्या कोई आत्म समय है? हाँ। foo
स्वयं समय का 100% लेता है। यह एक वास्तविक "हॉट स्पॉट" है। क्या इससे आपको बाधा मिलती है? नहीं। क्योंकि यह foo
में नहीं है।
गर्म पथ क्या है?ठीक है, ढेर नमूने इस तरह दिखेगा:
मुख्य -> 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
इंस्ट्रुमेंटेशन मैं क्या जरूरत के प्रति अधिक प्रतीत हो रहा है, मैं देख सकता है: वहाँ 8 संभावनाएं हैं प्रत्येक समारोह के अंदर कितना समय बिताया गया था। एक बार फिर धन्यवाद! –
@ पीटर ह्यूएन: विषय से थोड़ी दूर, लेकिन मैं उत्सुक हूं कि एक ही रन में देशी और .NET कोड दोनों के लिए स्रोत कोड कवरेज जानकारी प्राप्त करना संभव है। मेरा मुख्य exe एक मूल .exe है जो .NET dlls – Chubsdad
@Chubsdad का उपयोग करता है: यह है। यदि आप वीएस 2010 या इससे पहले का उपयोग कर रहे हैं, तो आपको वीएसआईएनस्ट्रेट का उपयोग करके देशी और प्रबंधित दोनों निष्पादन योग्य और वीएसपीआरएफएमन का उपयोग करके एकत्रित करने की आवश्यकता है। 2012 में, कोड कवरेज टूल (CodeCoverage.exe) देशी और प्रबंधित निष्पादन योग्य दोनों ऑन-द-फ्लाई (स्मृति में) का वाद्य यंत्र प्रदान करेगा, बशर्ते उनके .pdbs संग्रह समय पर मौजूद हों। –