2009-01-20 14 views
19

जब मैं एक विश्वविद्यालय परियोजना पर काम कर रहा था, मैंने एक बड़े छात्र द्वारा किए गए एक परियोजना-आंतरिक प्रोफाइलर का उपयोग किया, यह बहुत बुनियादी था लेकिन काफी अच्छा था क्योंकि इसका कार्य कोड के दो बिंदुओं के बीच समय घटाना था और आंकड़े देना था।कोड प्रोफाइलर कैसे काम करते हैं?

अब, पेशेवर प्रोफाइलर कैसे काम करता है? क्या यह चेकपॉइंट्स या उस तरह की चीजें डालने के लिए कोड को प्रीप्रोसेस करता है? क्या यह एक फ़ंक्शन कहलाता है, इसे पकड़ने के लिए डीबग डेटा के साथ बाइनरी कोड पढ़ता है?

धन्यवाद।

उत्तर

22

कई अलग-अलग प्रोफाइलर हैं जो विभिन्न तरीकों से काम करते हैं।

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

साथ ही नियमित रूप से नमूनाकरण, आप कैश मिस जैसे कुछ निश्चित घटनाओं के बाद प्रोसेसर प्रदर्शन काउंटर का नमूना भी उपयोग कर सकते हैं, जो आपको यह देखने में मदद करेगा कि आपके प्रोग्राम के कौन से हिस्से मेमोरी एक्सेस के कारण धीमा हो रहे हैं।

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

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

2

यह कोड के प्रकार के प्रकार पर निर्भर करता है, उदाहरण के लिए .NET CLR कोड प्रोफाइलर्स के लिए facility प्रदान करता है। प्रबंधित कोड से निपटने पर कस्टम हुक इंजेक्ट करने के लिए इंटरमीडिएट कोड को फिर से लिखना संभव है। इसके अलावा आप अनुप्रयोगों के स्टैक ट्रेस का विश्लेषण कर सकते हैं। ऑपरेटिंग सिस्टम प्रोफाइलिंग के लिए साधन प्रदान कर सकता है, उदाहरण के लिए विंडोज performance counters है। एम्बेडेड कोड से निपटने पर आप सिस्टम प्रदर्शन को प्रभावी ढंग से मॉनीटर करने के लिए अंतर्निहित हार्डवेयर का अनुकरण/प्रतिस्थापित कर सकते हैं।

+0

"प्रबंधित कोड" से आपका क्या मतलब है? – tunnuz

+0

http://en.wikipedia.org/wiki/Managed_code – aku

13

दो आम प्रोफाइलिंग रणनीतियों (वीएम-आधारित भाषाओं के लिए वैसे भी) हैं: उपकरण और नमूनाकरण।

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

नमूनाकरण समय-समय पर वीएम से पूछता है कि स्टैक ट्रेस सभी धागे के लिए कैसा दिखता है, और इसके आंकड़ों को इस तरह अद्यतन करता है। यह आम तौर पर प्रदर्शन को कम प्रभावित करता है, लेकिन कम सटीक कॉल गणना करता है।

+1

आईएमओ, सबसे अच्छा तरीका स्टैक निशान के छोटे # को कैप्चर करना है। फिर, उन पर प्रत्येक stmt/instr के लिए इसमें नमूने के% की रिपोर्ट करें। परीक्षण करने के लिए सबसे अच्छे अंक उस सूची में हैं, भले ही समय अनुमान मोटे हों। यह फ़ंक्शन समय से अधिक उपयोगी है। –

0

* nix में gprof के लिए, -जीपी का उपयोग करके संकलन और लिंक समय पर, कुछ अतिरिक्त कोड ऑब्जेक्ट कोड में इंजेक्शन दिया जाता है। फिर gprof चलाकर, इंजेक्शन कोड द्वारा एक रिपोर्ट फ़ाइल उत्पन्न होती है।

2

जैसा कि जॉन स्कीट ने लिखा है, वहां दो रणनीतियों हैं: उपकरण और नमूनाकरण।

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

नमूना प्रोफाइलर द्वारा किया जाता है और यह बाइनरी कोड में दिखता है। प्रोफाइलर प्रोफाइलिंग के उद्देश्य के लिए हुक या जाल विंडोज इवेंट/संदेश जैसी तकनीकों को भी कर सकता है।

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

इंस्ट्रुमेंटेशन बनाम नमूनाकरण: ऐसा नहीं है कि दूसरे दृष्टिकोण से बेहतर है। दोनों की जगह है।

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

उपरोक्त से संसाधनों को पहचानने की पहचान की जाती है।

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

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