2012-10-23 29 views
5

मैं अपना कोड प्रोफाइल कर रहा हूं और मुझे पहले से ही इसका सबसे महंगा हिस्सा मिला है। हालांकि यह एक रेखांकित समारोह में होता है। प्रभाव को मापने के लिए मैंने फ़ंक्शन को रेखांकित नहीं किया था।कॉलग्रिंड इनलाइन फ़ंक्शन

अब मैं सटीक प्रोफाइलिंग डेटा की रिपोर्ट करना चाहता हूं। इनलाइन के बिना हमारे पास एक विशाल ओवरहेड है (फ़ंक्शन मूल रूप से एक लूप है, लेकिन इसे बहुत बार कहा जाता है)।

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

उत्तर

5
valgrind --tool=callgrind 

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

उदा। चलाने की कोशिश करें साथ:

valgrind --tool=callgrind --dump-instr=yes --collect-jumps=yes 

नोट: देखने के लिए अनुदेश स्तर पर लागत, आप kcachegrind

+0

वास्तव में यह बहुत अच्छा काम करता है। kcachegrind एक बहुत अच्छा उपकरण है! – ypnos

-1

इम यकीन नहीं करता है, तो यह है कि तुम क्या चाहते हैं, लेकिन मैं निश्चित नहीं यह :) नहीं है: के बाद से एक अनुदेश कैश पढ़ने अनुदेश निष्पादित प्रति किया जाता है
http://valgrind.org/docs/manual/cg-manual.html#cg-manual.overview

इसके अलावा, आप पा सकते हैं लाइन प्रति कितने निर्देश निष्पादित किए जाते हैं, जो पारंपरिक प्रोफाइलिंग के लिए उपयोगी हो सकते हैं।

+0

हाँ, मुझे लगता है कि लाइन को पढ़ने का उपयोग करना चाहिए, फिर भी मैं समारोह दायरे में विवरण का स्तर से परे कुछ भी करने को कैसे पता नहीं कर सका। – ypnos

0

शायद तुम सिर्फ अपने समारोह कॉल करने से पहले और अपने समारोह, अपने कार्य के निकास के लिए डिट्टो की शुरुआत में और सिर्फ अपने समारोह के कॉल के बाद CALLGRIND_TOGGLE_COLLECT मैक्रो कह सकते हैं। ईजी।

int main() 
{ 
    CALLGRIND_TOGGLE_COLLECT; 
    myFunction(); 
    CALLGRIND_TOGGLE_COLLECT; 
} 

__attribute__((noinline)) 
void myFunction() 
{ 
    CALLGRIND_TOGGLE_COLLECT; 
    //Do stuff 
    CALLGRIND_TOGGLE_COLLECT; 
} 

चाल चलाना चाहिए।

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