2011-02-08 7 views
8

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

यह बहुत अच्छा है, लेकिन कभी-कभी मुझे अधिकतर समय में प्रोग्रामिंग के साथ अधिक रुचि होती है, जहां से अधिकांश समय EIP था। मेरी काल्पनिक प्रोफाइलर की

एक उदाहरण उत्पादन होता है:

Waiting for file IO - 19% of execution time. 
Waiting for network - 4% of execution time 
Cache misses  - 70% of execution time. 
Actual computation - 7% of execution time. 

वहाँ इस तरह के एक प्रोफाइलर है? क्या "मानक" प्रोफाइलर से ऐसा आउटपुट प्राप्त करना संभव है?

मैं लिनक्स का उपयोग कर रहा हूं, लेकिन मुझे अन्य प्रणालियों के लिए कोई समाधान सुनकर खुशी होगी।

+0

क्या प्रोफाइलर डेटा लेने और उन्हें इस फ़ॉर्म में रखने के लिए उपकरण हैं? –

+0

आप इसे किस ऑपरेटिंग सिस्टम पर चलाने के लिए चाहते हैं? वहाँ सोलारिस और मैक ओएस एक्स उदाहरण प्रतिशत है कि 100% तक :-) –

+1

कुडोस के लिए इस तरह के उपकरणों होने लगते हैं - मुझे लगता है कि यह और भी DTrace पर बनाया जा सकता है। – templatetypedef

उत्तर

1

यह केवल सोलारिस है, लेकिन ड्रेसर लगभग हर प्रकार के आई/ओ, सीपीयू चालू/बंद, विशिष्ट कार्यों में समय, नींद का समय इत्यादि की निगरानी कर सकता है। मुझे यकीन नहीं है कि यह कैश मिस को निर्धारित कर सकता है, मानते हुए आपका मतलब सीपीयू कैश है - मुझे यकीन नहीं है कि वह जानकारी सीपीयू द्वारा उपलब्ध कराई गई है या नहीं।

+0

इसके अलावा उपकरण मैक ओएस एक्स यह कर सकते हैं के लिए चुनने के लिए –

1

कृपया एक नज़र at this और this ले।

किसी भी धागे पर विचार करें। समय के किसी भी समय यह कुछ कर रहा है, और यह किसी कारण से कर रहा है, और धीमेपन को उस समय के रूप में परिभाषित किया जा सकता है जब वह खराब कारणों से खर्च करता है - उसे उस समय खर्च करने की आवश्यकता नहीं होती है।

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

  1. यदि इनमें से कोई भी कदम एक बहुत अच्छा कारण नहीं है और इससे बचा जा सकता है, तो उस समय के तत्काल खर्च करने की आवश्यकता नहीं है।
उस समय डिस्क निश्चित क्षेत्र के लिए चारों ओर आ रहा है पर

हो सकता है, तो कुछ डेटा स्ट्रीमिंग शुरू किया जा सकता है, तो एक बफर भरा जा सकता है, तो एक पढ़ा बयान संतुष्ट हो सकता है, एक समारोह में, और कहा कि समारोह है किसी अन्य फ़ंक्शन में एक कॉल साइट से कहा जाता है, और वह दूसरे से, और इसी तरह, call _main तक, या जो भी थ्रेड के शीर्ष पर होता है।

  1. दोहराएँ पिछले बिंदु 1.

तो, जिस तरह से बाधाओं को खोजने के लिए जब कोड गरीब कारणों के लिए समय बिताने है मिल रहा है, और सबसे अच्छा तरीका है कि खोजने के लिए की फोटो लेने के लिए है इसके राज्य। ईआईपी, या राज्य का कोई अन्य छोटा टुकड़ा ऐसा करने वाला नहीं है, क्योंकि यह आपको क्यों नहीं बताएगा

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

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

यह एक रहस्यमय विषय नहीं है।

+0

आपने नमूनाकरण की शास्त्रीय सांख्यिकीय विधि प्रस्तुत की है, और ध्यान दें कि आप यादृच्छिक रूप से समान रूप से नमूनाकरण करके अधिक सटीक परिणाम प्राप्त कर सकते हैं, जो केवल एक समारोह कहलाते समय नमूनाकरण से बेहतर होता है, क्योंकि 'gprof' कर रहा है। एक साइड नोट के रूप में मैं टिप्पणी करूंगा कि मुझे यकीन नहीं है कि इस मामले में नमूना समान रूप से ऐसा लाभ देता है, क्योंकि आप किसी भी तरह से ओवरलैप्लिंग कर रहे हैं, प्रत्येक फ़ंक्शन कॉल पर नमूना पर्याप्त से अधिक है। बेशक, आपको खराब परिणाम मिलेंगे - लेकिन आपका प्रोफाइलर सरल होगा और शायद यह इसके लायक है। लेकिन जो मुझे समझ में नहीं आता है, वह मेरे प्रश्न का उत्तर कैसे दे रहा है? –

+0

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

+0

माइक, मेरा मतलब था आंकड़ों के रूप में नमूनाकरण। आप किसी बिंदु पर प्रोग्राम स्थिति को मापते हैं। इंस्ट्रुमेंटेशन एक गैर-वर्दी फैशन में आपके प्रोग्राम का नमूना देने का एक तरीका है, यह http://goo.gl/3mSJ0 इसका नमूना देने का एक और गैर-मानक तरीका है। मैं जो कह रहा हूं वह यह है कि यद्यपि उपकरण समान रूप से नमूना नहीं कर रहा है, यह आपके प्रोग्राम को अक्सर पर्याप्त नमूना देता है ताकि प्रभावी ढंग से आपके पास नमूना होगा, 2 एमएस कहें, और इस प्रकार यह भी उपयोगी हो सकता है। आपको पता चलेगा कि आपके प्रभावी नमूना दर पर कोड के कौन से हिस्से बाधाएं हैं। समान नमूनाकरण बेहतर है, लेकिन गैर वर्दी नमूना बेकार नहीं है। –

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