2009-06-23 11 views
23

संचित कोई समय सबमिट नहीं किया गया है। मैं ओएसएक्स 10.5.7 चलाने वाली मशीन पर gprof के साथ एक सी ++ एप्लिकेशन को प्रोफाइल करने का प्रयास कर रहा हूं। मैं सामान्य रूप से g ++ के साथ संकलित करता हूं, लेकिन -pg झंडे का उपयोग करके, एप्लिकेशन चलाता हूं और gprof के साथ कॉल ग्राफ़ को देखने का प्रयास करता हूं।gprof रिपोर्ट्स

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

मेरे सभी स्रोत फ़ाइलें एक समान तरीके से संकलित किए जाते हैं:

g++ -pg -O2 -DNDEBUG -I./ -ansi -c -o ScenarioLoader.o ScenarioLoader.cpp 

मैं तो चलाने 'की गिरफ्तारी' एक पुस्तकालय में सभी वस्तु फ़ाइलों बंडल करने। बाद में, मैं लिंक और के रूप में तो gprof चलाएँ:

g++ -pg -lm -o vrpalone vrpalone.o ../src/atomicprof.a lastbuild.o 
./vrpalone 
gprof gmon.out | less 

कोई भी विचार?

+0

** gprof ** 1 9 82 से आसपास रहा है। उस समय से, कंप्यूटर और भाषाओं के डिजाइन में काफी वृद्धि हुई है, लेकिन प्रदर्शन मुद्दों की हमारी सामूहिक समझ बहुत कम हो गई है।हम अभी भी वही अवधारणाओं के बारे में बात करते हैं जो ** gprof ** पेश किए गए हैं, और हमने उन्हें वास्तव में समझने की मांग नहीं की है। [यहां कुछ नए विचारों की चर्चा और प्रस्तुति दी गई है।] (Https://stackoverflow.com/questions/1777556/alternatives-to-gprof/1779343#1779343) –

उत्तर

5

मैंने सोचा कि मैं this Apple mailing list discussion साझा कर सकता हूं जिसे मैंने हाल ही में पार किया था।

यहां वर्णित व्यवहार बिल्कुल वैसा ही है जो मैं अनुभव कर रहा हूं। ऐसा लगता है कि कुछ समय के लिए ओएसएक्स पर gprof टूट गया है।

मैंने शार्क का सहारा लिया है जिसे डेव रिग्बी द्वारा मददगार तरीके से सुझाया गया है।

धन्यवाद!

11

यदि आपका प्रोग्राम एक गैर-साफ तरीके से समाप्त हो जाता है तो प्रोफ़ाइल डेटा सही ढंग से लिखा नहीं जाएगा - आपका प्रोग्राम कैसे निकल रहा है?

भले ही, मैं gprof के बजाय Shark का उपयोग करने की दृढ़ता से अनुशंसा करता हूं - यह gprof के लिए हर तरह से उपयोग करने में बहुत आसान है और बेहतर है - और आपको अपने प्रोग्राम को पुन: संकलित करने की आवश्यकता नहीं है।

+0

हाय डेव। मेरा कार्यक्रम साफ-सुथरा हो जाता है। मैंने शार्क पर एक नज़र डाली है और यह काम करता है, लेकिन मैं इसे एक फ्लैट प्रोफ़ाइल उत्पन्न नहीं कर सकता। एक flattening विकल्प है जो मैंने पाया है, लेकिन यह वही जानकारी प्रदर्शित नहीं करता है जो gprof है जो अभिविन्यास है; आदर्श रूप में मैं एक ही नाम के साथ सभी कार्यों को एक साथ जोड़ना चाहता हूं। मैं शार्क को प्रत्येक समारोह में कॉल की संख्या प्रदर्शित करने के लिए प्रतीत नहीं कर सकता। – Daniel

+0

मुझे फ़्लैटिंग समस्या को हल करने के लिए "भारी दृश्य" विकल्प मिला। अभी भी कॉल की संख्या प्रदर्शित करने का एक अच्छा तरीका नहीं देख सकता है। ओह अच्छा। मुझे लगता है कि मेरे पास पर्याप्त है! मदद डेव के लिए चीयर्स। शार्क के लिए – Daniel

+0

मजबूत +1। ओएसएक्स पर विकास करते समय gprof या Google Perf उपकरण धड़कता है। आप किसी दिए गए पंक्ति का चयन करके नमूने की सटीक संख्या देख सकते हैं। यह तब नीचे के फ़ंक्शन पर नमूने की संख्या दिखाता है। शायद ही यह उपयोगी है हालांकि दिया गया है कि% क्या सहायक है। – Tristan

2

आपका प्रोग्राम कितना तेज़ चलता है? यदि यह बेहद तेज़ है, तो वास्तव में प्रोफ़ाइल के लिए यह बहुत तेज़ हो सकता है। मुझे एक बहुत ही सरल पाठ प्रसंस्करण कार्यक्रम के साथ यह समस्या थी: जब मैंने इसे अपनी उप-1 केबी परीक्षण फ़ाइल के साथ चलाया तो यह समय कॉलम में सभी 0s की सूचना दी। मैंने इसे ग्रेट गत्स्बी के पूरे पाठ को चलाकर हल किया। अपने मुख्य गणना के माध्यम से कुछ सौ बार एक बड़ा डेटासेट या लूपिंग आज़माएं।

+0

हाय psanf। मेरा प्रोग्राम इनपुट के आधार पर काफी समय तक चलता है (यह विभिन्न यात्रा विक्रेता समस्याओं को हल करता है)। मैंने 318 शहरों से जुड़ी एक छोटी सी समस्या का उपयोग करके इसे प्रोफाइल करने का प्रयास किया है जो हल करने के लिए ~ 30 सेकंड लेता है। – Daniel

2

क्या आपका प्रोग्राम एकाधिक धागे का उपयोग करता है? मैंने लिनक्स पर बहुप्रचारित कार्यक्रमों के साथ इस मुद्दे का अनुभव किया है, यह सुनिश्चित नहीं है कि ओएस एक्स में एक ही समस्या होगी

यहां मल्टीथ्रेडिंग समस्या के लिए solution है जिसे मैंने अतीत में सफलतापूर्वक उपयोग किया है।

+0

हाय bklock। मेरा कार्यक्रम केवल इस समय अकेले थ्रेड किया गया है। हालांकि मैं उस लिंक को दिमाग में रखूंगा! – Daniel

2

शायद ओपी के प्रश्न से प्रासंगिक नहीं है, वहां एक आम परिदृश्य है जहां "कोई समय संचित नहीं होता" होता है: यदि आपका कोड कर्नेल को कॉल करता है या -pg के साथ संकलित पुस्तकालयों को कॉल नहीं करता है, तो आप समय व्यतीत करने के लिए जमा नहीं होंगे क्या आप वहां मौजूद हैं।

2

बीटीडब्ल्यू, क्या आप अपने कोड में फोर्क() करते हैं? यदि हां, तो सिर्फ कांटा (के बाद) बच्चे प्रक्रिया में इस जोड़ें:

extern void _start (void), etext (void); 
monstartup ((u_long) &_start, (u_long) &etext); 

वह मेरे लिए चाल किया था।

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