2009-09-24 4 views
5

कहें कि मेरे पास ऐसा कार्य है जिसे कई अलग-अलग स्थानों से बहुत कम कहा जाता है। इसलिए मैं यह जानना चाहता हूं कि यह कार्य सबसे अधिक कौन कहता है। उदाहरण के लिए, शीर्ष 5 कॉलर या जिन्होंने कभी भी इस समारोह को एन बार से अधिक कहते हैं।क्या सी फ़ंक्शन के शीर्ष कॉलर्स को समझने का कोई तरीका है?

मैं एएस 3 लिनक्स, जीसीसी 3.4 का उपयोग कर रहा हूं।

अभी के लिए मैं सिर्फ एक ब्रेकप्वाइंट रखा और फिर हर 300 बार के बाद वहाँ बंद करो, इस प्रकार यह जानवर-मजबूर कर ...

किसी को भी उपकरण है कि मेरी मदद कर सकते का पता है?

धन्यवाद

+1

क्या ऐसा नहीं कर सकता है? –

+2

मुझे पता है, यह कर सकते हैं :)? – vehomzzz

+1

ने कभी भी gprof – vehomzzz

उत्तर

2

मैंने मस्ती के लिए कॉल लॉगिंग उदाहरण लिखा था। एक मैक्रो एक वाद्य यंत्र के साथ फंक्शन कॉल बदलता है।

include <stdio.h>. 

int funcA(int a, int b){ return a+b; } 

// instrumentation 

void call_log(const char*file,const char*function,const int line,const char*args){ 
    printf("file:%s line: %i function: %s args: %s\n",file,line,function,args); 
} 

#define funcA(...) \ 
    (call_log(__FILE__, __FUNCTION__, __LINE__, "" #__VA_ARGS__), funcA(__VA_ARGS__)). 

// testing 

void funcB(void){ 
    funcA(7,8); 
} 


int main(void){ 
    int x = funcA(1,2)+ 

      funcA(3,4); 

    printf("x: %i (==10)\n", x); 

    funcA(5,6); 

    funcB(); 
} 

आउटपुट:

file:main.c line: 22 function: main args: 1,2 
file:main.c line: 24 function: main args: 3,4 
x: 10 (==10) 
file:main.c line: 28 function: main args: 5,6 
file:main.c line: 17 function: funcB args: 7,8 
+0

ग्रेट !!!! मैं ऐसा कुछ लागू कर सकता हूं – vehomzzz

2

प्रोफाइलिंग सहायता करता है।

+0

मैं एक प्रोफ़ाइल oprofile usbng हूँ, लेकिन यह मुझे इस स्तर की जानकारी नहीं देता – vehomzzz

+0

ऐसा करने वाले कई लोग हैं। दानदम ने अपने जवाब में एक सुझाव दिया है। –

18

-pg विकल्प के साथ संकलित करें, थोड़ी देर के लिए प्रोग्राम चलाएं और फिर gprof का उपयोग करें। -पीजी विकल्प के साथ संकलित एक प्रोग्राम चलाना निष्पादन प्रोफाइल के साथ gmon.out फ़ाइल उत्पन्न करेगा। gprof इस फ़ाइल को पढ़ सकते हैं और इसे पठनीय रूप में प्रस्तुत कर सकते हैं।

+3

और gprof2dot (http://code.google.com/p/jrfonseca/wiki/Gprof2Dot) उस आउटपुट को एक अच्छे ग्राफ में बना सकता है ;-) – ChristopheD

1

चूंकि आपने किसी अन्य टिप्पणी में oprofile का उल्लेख किया है, तो मैं कहूंगा कि oprofile प्रोफाइल प्रोग्राम पर कॉलग्राफ उत्पन्न करने का समर्थन करता है। अधिक जानकारी के लिए

http://oprofile.sourceforge.net/doc/opreport.html#opreport-callgraph देखें।

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

0

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

#define COUNTED_CALL(fn, ...) do{ \ 
    fprintf(call_log_fp, "%s->%s\n", __FUNCTION__, #fn) ; \ 
    (fn)(__VA_ARGS__) ; \ 
}while(0) ; 

तो सभी कॉल की तरह लिखा:

1

एक कुछ हद तक बोझिल विधि है, लेकिन अतिरिक्त उपकरण की जरूरत नहीं

int input_available = COUNTED_CALL(scanf, "%s", &instring) ; 

call_log_fp से जुड़े फाइल करने के लिए लॉग इन किया जाएगा (एक वैश्विक फ़ाइल * जो आपको प्रारंभ करना होगा)। उपर्युक्त के लिए लॉग इस तरह दिखेगा:

main->scanf 

फिर आप उस डेटा फ़ाइल को संसाधित करने के लिए उस लॉग फ़ाइल को संसाधित कर सकते हैं। आप उपकरण को करने के लिए अपना स्वयं का कोड भी लिख सकते हैं जो इसे कम बोझिल बना देगा।

हालांकि सी ++ वर्ग सदस्य कार्यों के लिए थोड़ा अस्पष्ट हो सकता है। मुझे यकीन नहीं है कि __CLASS__ मैक्रो है या नहीं।

0

एक बार फिर, stack sampling to the rescue! बस जितनी चाहें उतनी "स्टैकशॉट" का एक गुच्छा लें। किसी भी नमूने को छोड़ दें जहां आपका फ़ंक्शन (इसे कॉल करें) स्टैक पर कहीं नहीं है।(यदि आप उनमें से अधिकतर को छोड़ रहे हैं, तो एफ एक प्रदर्शन समस्या नहीं है।)

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

रैंक कितने ढेर हर एक में।

लगता है कि आप हाथ से यह करने के लिए नहीं करना चाहते हैं के द्वारा अपने जी, आप एक साधारण उपकरण या स्क्रिप्ट बना सकते हैं। आपको एक अरब नमूने की आवश्यकता नहीं है। 20 या तो आपको उचित रूप से अच्छी जानकारी देगा।

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

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

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

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