2012-06-08 10 views
6

मेरे पास कई .h और .c फ़ाइलों और कई फ़ंक्शंस से बना एक प्रोग्राम है। और ऐसे कार्य हैं जो अन्य कार्यों को बुलाते हैं और इसी तरह। अब, यह वास्तव में एक असाइनमेंट है इसलिए मुझे पता है कि कार्यक्रम को अंत तक पहुंचने की कितनी आवश्यकता है।एक सी प्रोग्राम को धीमा कर रहा है यह जानने के लिए उपकरण?

समस्या यह है कि, मेरे कार्यक्रम को दिए गए समय की तुलना में बहुत अधिक समय लगता है। क्या यह पता लगाना संभव है कि कौन सा फ़ंक्शन बहुत अधिक समय ले रहा है या कोड का कौन सा हिस्सा प्रोग्राम को दबा रहा है?


मैंने कोड यहां नहीं दिया क्योंकि यह बहुत लंबा है। मुझे पता है कि कोई भी जवाब नहीं दे सकता कि क्यों "मेरा कार्यक्रम" धीमा है लेकिन मैं सामान्य रूप से बात कर रहा हूं! क्या कोई ऐसा उपकरण है जो मापता है कि प्रत्येक कार्य कितना समय लेता है या कुछ समान होता है? मैं जीसीसी का उपयोग कर रहा हूं और मैं लिनक्स पर हूं।

+5

यह असंभव है। रूट कारणों का एक संपूर्ण ब्रह्मांड मौजूद है और आपने हमें कोड भी नहीं दिखाया है। –

+11

आपको [प्रोफाइलिंग] में देखना चाहिए (https://en.wikipedia.org/wiki/Profiling_%28computer_programming%29)। यह वास्तव में प्रक्रिया है जो आपकी समस्या का समाधान करेगी। ('gprof' एक प्रोफाइलर का एक उदाहरण है जो अक्सर यूनिक्स/लिनक्स सिस्टम पर पूर्व-स्थापित होता है।) – huon

+3

आपको वास्तव में @dbaupp द्वारा संकेत के अनुसार अपना कोड प्रोफाइल करना चाहिए। कुछ टूल्स - valgrind = http://valgrind.org/, gprof = http: //www.cs.utah.edu/dept/old/texinfo/as/gprof_toc.html ... http: //oprofile.sourceforge। नेट/समाचार/= OProfile। जीपीआरओफ़ उनमें से बहुत अच्छा है मैं अक्सर इसका इस्तेमाल करता हूं। – verisimilitude

उत्तर

9

चूंकि आप लिनक्स पर हैं, तो आपके पास शायद पहले से ही gprof प्रोफाइलर स्थापित है। gprof का सबसे बुनियादी उपयोग -pg विकल्प (-g विकल्प को जानकारीपूर्ण आउटपुट प्राप्त करने के लिए भी आवश्यक है) के साथ संकलित करना है। जैसे

> gcc -g -pg -o my_executable my_file.c 

अब, आप सामान्य रूप से अपना प्रोग्राम चला सकते हैं। फिर आप

> gprof my_executable > profile.txt 

जो प्रोफाइलिंग जानकारी को profile.txt में आउटपुट करेगा। इस डेटा की तरह

Flat profile: 

Each sample counts as 0.01 seconds. 
    % cumulative self    self  total   
time seconds seconds calls ms/call ms/call name  
33.34  0.02  0.02  7208  0.00  0.00 open 
16.67  0.03  0.01  244  0.04  0.12 offtime 
16.67  0.04  0.01  8  1.25  1.25 memccpy 
16.67  0.05  0.01  7  1.43  1.43 write 
16.67  0.06  0.01        mcount 
    0.00  0.06  0.00  236  0.00  0.00 tzset 
    0.00  0.06  0.00  192  0.00  0.00 tolower 
    0.00  0.06  0.00  47  0.00  0.00 strlen 
    0.00  0.06  0.00  45  0.00  0.00 strchr 
    0.00  0.06  0.00  1  0.00 50.00 main 
    0.00  0.06  0.00  1  0.00  0.00 memcpy 
    0.00  0.06  0.00  1  0.00 10.11 print 
    0.00  0.06  0.00  1  0.00  0.00 profil 
    0.00  0.06  0.00  1  0.00 50.00 report 

[...] 

एक छोटे से लग रहा है और आप प्रत्येक कार्य के बारे में कुछ डेटा बंद पढ़ सकते हैं (उदाहरण के लिए open 7208 बार बुलाया गया था और 0.02S यह क्रियान्वित करते हुए बिताया।)। उस उदाहरण डेटा को this guide से उधार लिया गया था, जिसे आपको पढ़ना चाहिए क्योंकि यह अधिक स्पष्टीकरण देता है और यह बताता है कि प्रोफाइल-लाइन-लाइन प्रोफाइलिंग जैसी चीज़ों को प्राप्त करने के लिए प्रोफाइलिंग में हेरफेर कैसे किया जाता है।

+0

बहुत बहुत धन्यवाद। यह पूर्ण है! – MinaHany

+0

क्या यह संभावना है कि यदि आप '-g' के साथ संकलित नहीं करेंगे तो विभिन्न कार्यों के समय के अनुपात बदल जाएंगे? – simon

+0

@ सिमॉन, मुझे नहीं लगता कि इससे बड़ा अंतर आएगा, लेकिन मुझे यकीन नहीं है। एक उपयोगकर्ता लाइसेंस के लिए – huon

1

ऊपर dbaupp द्वारा सुझाए गए अनुसार, gprof linux के लिए एक उत्कृष्ट उपकरण है। इसके अतिरिक्त, यदि आपके पास IBM Rational Quantify तक पहुंच है, तो आप इसे भी आजमा सकते हैं। यह एक वाणिज्यिक उपकरण है, लेकिन अधिक समय और कॉल प्रवाह इत्यादि के कार्यों के अच्छे ग्राफिकल दृश्य प्रदान करता है

+0

पवित्र ** $$$$ 7k ** !? इससे मेरे सभी माइक्रोसॉफ्ट टूल्स सस्ते लगते हैं ... –

+0

आप जानते हैं कि मजाकिया क्या है, यह 7.7k € है जो 9.6k डॉलर से अधिक हो जाता है, जिससे प्यार को शाफ्ट किया जा सकता है। –

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