2011-04-27 13 views
13

मुझे उत्सुकता है कि एक ठेठ सी # प्रोफाइलर कैसे काम करता है?सी # प्रोफाइलर कैसे काम करता है?

वर्चुअल मशीन में विशेष हुक हैं?

क्या फ़ंक्शन कॉल के लिए बाइट कोड स्कैन करना और टाइमर को प्रारंभ/बंद करने के लिए कॉल इंजेक्ट करना आसान है?

या यह वास्तव में कठिन है और यही कारण है कि लोग ऐसा करने के लिए उपकरण का भुगतान करते हैं?

(एक तरफ ध्यान दें के रूप में मैं थोड़ा दिलचस्प बीईसी यह इतना दुर्लभ है - गूगल नाव याद करते हैं पूरी तरह से खोज "how does a c# profiler work?" बिल्कुल काम नहीं करता है पर - परिणाम एयर कंडीशनर के बारे में कर रहे हैं ...)

+3

मैं जॉन स्कीट के लिए प्रतीक्षा करें। –

+2

इस आलेख में बहुत अच्छी जानकारी है: http://msdn.microsoft.com/en-us/magazine/cc301725.aspx। इसके अलावा http://msdn.microsoft.com/en-us/library/bb384547.aspx –

+0

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

उत्तर

3

माइक्रोसॉफ्ट, संस्करण 4.0 द्वारा एक मुफ्त सीएलआर प्रोफाइलर है।

https://www.microsoft.com/downloads/en/details.aspx?FamilyID=be2d842b-fdce-4600-8d32-a3cf74fda5e1

BTW, वहाँ CLR प्रोफाइलर दस्तावेज़ में एक अच्छा अनुभाग है जो बताती है कि यह कैसे काम करता, विस्तार से, पेज 103. वहाँ distro के हिस्से के रूप में स्रोत है।

+3

यह जानना अच्छा है, लेकिन सवाल के जवाब के साथ इसका कोई संबंध नहीं है। डाउनवॉटर का मुकाबला करने के लिए –

+1

+1। आपने ओपी के सवाल का सीधा जवाब दिया है। –

+0

सीएलआर प्रोफाइलर इसके स्रोत के साथ आता है, अगर कोई दिलचस्पी लेता है कि यह कैसे काम करता है। –

1

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

2) प्रोफाइलिंग "सी #" और प्रोफाइलिंग "सीएलआर" है। एमएस दुनिया में, आप सीएलआर प्रोफाइल कर सकते हैं और सी # कोड में सीएलआर निर्देश स्थानों का बैक-अनुवाद कर सकते हैं। मुझे नहीं पता कि मोनो एक ही सीएलआर निर्देश सेट का उपयोग करता है या नहीं; अगर वे नहीं करते थे, तो आप एमएस सीएलआर प्रोफाइलर का उपयोग नहीं कर सके; आपको एक मोनो आईएल प्रोफाइलर का उपयोग करना होगा। या, आप प्रोफाइलिंग डेटा एकत्र करने के लिए सी # स्रोत कोड का उपयोग कर सकते हैं, और उसके बाद एमएस, मोनो, या किसी के सी # संगत कस्टम कंपाइलर या सी # पर उस डेटा को संकलित/चलाएं/एकत्रित करें जैसे कि WinCE जैसे एम्बेडेड सिस्टम में चल रहा है जहां अंतरिक्ष कीमती है और सीएलआर-बिल्ट-इन्स जैसी विशेषताएं छोड़ दी जाती हैं।

उपकरण स्रोत कोड का एक तरीका स्रोत-से-स्रोत परिवर्तनों का उपयोग करना है, ताकि कोड को प्रारंभिक स्थिति से कोड में मैप किया जा सके जिसमें डेटा संग्रहण कोड के साथ-साथ मूल प्रोग्राम भी शामिल हो। यह paper on instrumenting code to collect test coverage data दिखाता है कि कोड के ब्लॉक को निष्पादित करते समय ब्लॉक-विशिष्ट बूलियन झंडे सेट करने वाले बयान डालने से परीक्षण कवरेज जांच को सम्मिलित करने के लिए एक प्रोग्राम रूपांतरण प्रणाली का उपयोग कैसे किया जा सकता है। एक गिनती-प्रोफाइलर उन जांचों के लिए काउंटर-वृद्धि निर्देशों को प्रतिस्थापित करता है। एक समय प्रोफाइलर उन जांचों के लिए घड़ी-स्नैपशॉट/डेल्टा कंप्यूटेशंस डालता है। हमारे C# Profiler सी # स्रोत कोड दोनों तरीकों के लिए गिनती और समय दोनों प्रोफाइलिंग लागू करता है; यह निष्पादन पथ एकत्र करने वाली अधिक परिष्कृत जांच का उपयोग कर कॉल ग्राफ़ डेटा भी एकत्र करता है। इस प्रकार यह इस तरह कॉल ग्राफ पर समय डेटा का उत्पादन कर सकता है। यह योजना कहीं भी काम करती है जहां आप अपने हाथों को आधा रास्ते सभ्य रिज़ॉल्यूशन समय मान पर प्राप्त कर सकते हैं।

3

आसान शुरू करने के लिए समारोह कॉल के लिए बाइट कोड को स्कैन और कॉल सुई है/टाइमर रोक?

या यह वास्तव में कठिन है और यही कारण है कि लोग ऐसा करने के लिए टूल का भुगतान करते हैं?

कॉल इंजेक्शन करना काफी कठिन है कि इसे करने के लिए उपकरण की आवश्यकता है।

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

लिनक्स, शार्क, & अन्य के लिए प्रोफाइलर (जैसे Zoom) हैं जो एक अलग सिद्धांत पर काम करते हैं। सिद्धांत यह है कि एक फ़ंक्शन कॉल स्टैक होता है, और हर समय एक दिनचर्या के लिए ज़िम्मेदार होता है (या तो काम कर रहा है या अन्य दिनचर्या के लिए अनुरोध करने के लिए इंतजार कर रहा है) यह स्टैक पर है। तो यदि यह 50% समय (कहना) के लिए ज़िम्मेदार है, तो यह उस समय की मात्रा है जब यह स्टैक पर है, चाहे कितनी बार इसे कॉल किया गया हो या प्रति कॉल कितना समय लगे। न केवल स्टैक पर दिनचर्या है, लेकिन समय की लागत वाली कोड की विशिष्ट रेखाएं भी ढेर पर हैं। आपको उनके लिए शिकार करने की आवश्यकता नहीं है। एक और चीज जिसकी आपको आवश्यकता नहीं है वह माप की सटीकता है। यदि आपने 10,000 स्टैक नमूने लिया है, तो दोषी लाइनों को 50 +/- 0.5 प्रतिशत पर मापा जाएगा। यदि आप 100 नमूने लेते हैं, तो उन्हें 50 +/- 5 प्रतिशत के रूप में मापा जाएगा। यदि आपने 10 नमूने लिया, तो उन्हें 50 +/- 16 प्रतिशत के रूप में मापा जाएगा। प्रत्येक मामले में आप उन्हें पाते हैं, और यह आपका लक्ष्य है। (और रिकर्सन कोई फर्क नहीं पड़ता। इसका मतलब यह है कि दी गई रेखा किसी दिए गए स्टैक नमूने में एक से अधिक बार दिखाई दे सकती है।)

इस विषय पर, बहुत भ्रम है। किसी भी दर पर, प्रोफाइलर्स जो बाधाओं को ढूंढने के लिए सबसे प्रभावी हैं वे हैं जो स्टैक का नमूना देते हैं, दीवार घड़ी के समय पर, और लाइन द्वारा रिपोर्ट प्रतिशत। (यह देखना आसान कुछ myths about profiling परिप्रेक्ष्य में डाल रहे हैं है।)

+0

+1! लगता है कि हमें इस सरल अवधारणा के साथ डॉटनेट के लिए एक नया प्रोफाइलर लिखना चाहिए। जहां तक ​​यूआई जाता है, मैं WinDirStat के बारे में सोच रहा था, केवल हम नेमस्पेस.क्लास द्वारा समूहीकृत विभिन्न विधियों में बिताए गए समय दिखाएंगे। – GregC

+0

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

+0

@ ग्रेगसी: मैन्युअल विधि को न मारकर मेरा क्या मतलब है, सुनिश्चित करें कि मैन्युअल रूप से कई नमूने एकत्र करने में अधिक परेशानी है, "गर्म" रेखा चुनें और उस रेखा से पेड़ को नीचे और ऊपर देखें। यह थोड़ा कठिन है। लेकिन अगर मेरी आंखें पकड़ती हैं, तो मैं इसे फिर से शुरू करने तक अधिक नमूने लेता हूं, और फिर मैं यह कहने के लिए अध्ययन करता हूं कि कार्यक्रम क्या कर रहा था और क्यों। इसका मतलब स्टैक के अलावा अन्य डेटा को देखना हो सकता है। जब मैं इसे पूरी तरह से समझता हूं, तो मैं बता सकता हूं कि यह वास्तव में अपर्याप्त है और इसे कुछ बेहतर तरीके से बदला जा सकता है। तो उच्च% लाइनों को ढूंढना प्रक्रिया में केवल एक अग्रणी है। –

1

यह एक लंबा लेख है कि दोनों उपकरण और नमूना तरीकों पर चर्चा करने के लिए एक कड़ी है:

http://smartbear.com/support/articles/aqtime/profiling/

+0

नमूनाकरण के बारे में यह क्या कहता है केवल 30 साल पुराना जीप्रूफ मॉडल है। आधुनिक नमूने बहुत बेहतर करते हैं। –

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