2012-12-03 11 views
14

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

for (int i=0; i<maxSample; ++i) { 
    //Prepare data to be processed... 
    //Method to be profiled with these data 
    //Post operation on the data 
} 

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

मेरे पहली कोशिश करने के लिए कोड को बदलने के लिए किया गया था:

for (int i=0; i<maxSample; ++i) { 
    //Prepare data to be processed... 
    CALLGRIND_START_INSTRUMENTATION; 
    //Method to be profiled with these data 
    CALLGRIND_STOP_INSTRUMENTATION; 
    //Post operation on the data 
} 
CALLGRIND_DUMP_STATS; 

उपकरण नियंत्रण को नियंत्रित करने के लिए कॉलग्रेंड मैक्रोज़ जोड़ना। मैंने यह सुनिश्चित करने के लिए --instr-atstart = कोई विकल्प भी जोड़ा है कि मैं केवल उस कोड का हिस्सा हूं जो मैं चाहता हूं ...

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

मैं भी

for (int i=0; i<maxSample; ++i) { 
    //Prepare data to be processed... 
    CALLGRIND_TOGGLE_COLLECT; 
    //Method to be profiled with these data 
    CALLGRIND_TOGGLE_COLLECT; 
    //Post operation on the data 
} 
CALLGRIND_DUMP_STATS; 

(या --toggle-संग्रह = "MyMethod" विकल्प) की कोशिश की लेकिन Callgrind मुझे किसी भी कॉल के बिना एक लॉग लौटे (KCachegrind बर्फ के रूप में :(सफेद है और शून्य निर्देश का कहना है एक ...)

मैं सही ढंग से मैक्रो/विकल्प का उपयोग किया? मैं क्या आदेश अपेक्षित परिणाम प्राप्त करने के लिए बदलने की जरूरत के किसी भी विचार?

उत्तर

12

मैं अंत में इस समस्या को हल करने में कामयाब रहे ... यह था कॉन्फ़िगरेशन समस्या:

मैं कोड

for (int i=0; i<maxSample; ++i) { 
    //Prepare data to be processed... 
    CALLGRIND_TOGGLE_COLLECT; 
    //Method to be profiled with these data 
    CALLGRIND_TOGGLE_COLLECT; 
    //Post operation on the data 
} 
CALLGRIND_DUMP_STATS; 

रखा लेकिन --collect-atstart साथ callgrind दौड़ा = नहीं (और --instr-atstart बिना = नहीं !!!) है और यह पूरी तरह से काम किया, एक में उचित समय (~ 1min)।

स्टार्ट/स्टॉप उपकरण के साथ मुद्दा यह है कि callgrind प्रत्येक यात्रा (प्रत्येक रोकें) इस प्रकार यह वास्तव में बहुत धीमी थी ... (5min के बाद मैं केवल 5000 रन था पर एक फ़ाइल (callgrind.out। # संख्या) उदासीनता था एक 300 000 पुनरावृत्तियों बेंचमार्क ... एक रिग्रेशन परीक्षण के लिए अनुपयुक्त)।

+0

तो आप उपकरण शुरू/बंद नहीं करते? – Paschalis

+1

@Paschalis स्टार्ट/स्टॉप हर बार जब आप स्टॉप कॉल करते हैं तो नया डंप बना देगा। यदि आप एक ही रिपोर्ट में एकत्रीकरण प्राप्त करना चाहते हैं, तो टॉगल जाने का तरीका प्रतीत होता है (मूल रूप से यह केवल सक्रिय/निष्क्रिय उपकरण को फ़्लिप करता है)। – joetde

+0

प्रतिक्रिया @joetde के लिए धन्यवाद। मैंने पूछा क्योंकि मुझे एक समस्या का सामना करना पड़ रहा है जहां कॉलग्रिड या किसी अन्य उपकरण से कॉलबैक/मैक्रोज़ कभी भी नहीं कहा जाता है। अधिक [यहां] (http://goo.gl/08OM3c)! – Paschalis

0

टॉगल-संग्रह विकल्प ट्रिगर के रूप में उपयोग करने के तरीके को निर्दिष्ट करने में बहुत पसंद है। आपको वास्तव में अपनी तर्क सूची भी निर्दिष्ट करने की आवश्यकता है, और यहां तक ​​कि व्हाइटस्पेस को भी मिलान करने की आवश्यकता है! विधि नाम का उपयोग ठीक उसी तरह करें जैसा कि यह कॉलग्रिंड आउटपुट में दिखाई देता है। उदाहरण के लिए, मैं इस invokation उपयोग कर रहा हूँ:

$ valgrind 
    --tool=callgrind 
    --collect-atstart=no 
    "--toggle-collect=ctrl_simulate(float, int)" 
    ./swaag 

पालन करें:

  • विकल्प को दोहरे उद्धरण चिह्नों।
  • ब्रांड्स सहित तर्क सूची।
  • कॉमा चरित्र के बाद व्हाइटस्पेस।
संबंधित मुद्दे