सी

2011-09-14 15 views
5

में किसी फ़ंक्शन में मापने का समय मैं एक सी अनुप्रयोग डीबग कर रहा हूं और मैं जानना चाहता हूं कि यह किसी विशेष फ़ंक्शन में कितना समय व्यतीत करता है।सी

मैं स्रोत कोड बदल सकता हूं और माप करने के लिए कुछ और कोड जोड़ सकता हूं, लेकिन यह मेरे लिए सही नहीं लगता है। मैं इसे हर बार recompiling बिना, बाहरी आवेदन के साथ करना होगा।

मुझे पता चला यह GDB में एक को तोड़ने बिंदु स्थापित करने के लिए इसलिए मैंने सोचा कि, यह सरल प्रक्रिया द्वारा समान उपकरण का उपयोग कर समय को ट्रैक करना संभव होना चाहिए संभव है: - ब्रेकपाइंट सेट - जब बंद कर दिया, वास्तविक समय और चलाने के लिए उपाय समारोह - जब समारोह छोड़ रहा है, फिर से समय को मापने के हालांकि, मैं एक तरह से कैसे gdb :(

किसी भी विचार में यह करने के लिए नहीं मिला है धन्यवाद

उत्तर

2

आप जीसीसी का उपयोग कर रहे हैं, तो आप करना चाहते हैं? संकलन विकल्प "-pg" और अनुप्रयोग gprof

+0

'gprof' मुझे दिखाएगा कि फ़ंक्शन को कितनी बार बुलाया गया था, लेकिन मुझे समय दिखाना नहीं चाहता। यह सिर्फ "कोई समय जमा नहीं हुआ" –

+0

कहता है तो शायद इसे अनुकूलित या कुछ अनुकूलित किया गया था। –

1

प्रोफाइलिंग शायद आप जो चाहते हैं। प्रोफेसर या gprof पर एक नज़र डालें।

अद्यतन: "सीसी -Wall -ggdb -pg -g3 -O2 diskhash.c -ओ diskhash" के साथ compilng (और कार्यक्रम चलाने), "gprof -p diskhash" के बाद मुझे देता है:

Each sample counts as 0.01 seconds. 
    % cumulative self    self  total   
time seconds seconds calls ms/call ms/call name  
32.60  0.41  0.41  1 410.75 646.18 create_hashtab 
31.80  0.81  0.40 5087692  0.00  0.00 hash_func 
27.83  1.16  0.35 2543846  0.00  0.00 find_hash 
    2.78  1.20  0.04 2543846  0.00  0.00 chop_a_line 
    1.59  1.22  0.02        main 
    0.40  1.22  0.01        frame_dummy 
    0.00  1.22  0.00  4  0.00  0.00 map_da_file 
2

gprof केवल विश्वसनीय है - मेरे अनुभव में, केवल तभी काम करता है - यदि आप सी पुस्तकालय समेत प्रत्येक लाइब्रेरी के -pg संकलित संस्करणों को स्थिर रूप से लिंक करते हैं। आप इस जीसीसी का उपयोग -profile विकल्प क्या करना कोशिश कर सकते हैं (जो क्या करता है -pg करता प्लस -pg पुस्तकालयों में उप करने की कोशिश करता है), लेकिन समस्या जीएनयू libc वास्तव में स्थिर जोड़ा जा रहा है पसंद नहीं है, है, और अपने distro -pg संकलित संस्करण प्रदान नहीं कर सकते आपको आवश्यक हर लाइब्रेरी का।

मेरा सुझाव है कि आप cachegrind आज़माएं, जो valgrind ऑपरेशन मोड है और केवल सब कुछ के लिए डीबग जानकारी की आवश्यकता है। यह पाने के लिए बहुत आसान है। पकड़ है, यह भारी ओवरहेड लागत है; इतना बड़ा है कि यह आपके परीक्षण को अमान्य कर सकता है। कम से कम 2x मंदी की उम्मीद है।

आप perf भी कोशिश कर सकते हैं - यदि आप एक प्रतिलिपि पर अपना हाथ प्राप्त कर सकते हैं। यह बहुत चालाक है, लेकिन यह कर्नेल हैकर्स के लिए है, जो लोग स्क्रैच से सामान निर्माण करते हैं। मेरे पास बहुत मिश्रित भाग्य है। (Do http://web.eecs.utk.edu/~vweaver1/projects/perf-events/ अंतर्निहित एपीआई, नहीं उपयोगिता के बारे में है जो पढ़ा है, लेकिन अभी भी व्यर्थ समय के एक महान सौदा से आप को बचा सकता है।)

2

मैं अपने ~/.gdbinit में एक सहायक के कार्य हो:

define timeme 
set $last=clock() 
n 
set $timing=clock() - $last 
if $timing>$arg0 
printf "***long***\n" 
end 
printf "%d cycles, %f seconds\n", $timing, (float)$timing/1000000 
end 

आपको अपने प्लेटफ़ॉर्म पर CLOCKS_PER_SEC का कार्यान्वयन करने के आधार पर 1000000 समायोजित करने की आवश्यकता हो सकती है।

उपयोग मामूली है;

Breakpoint 2, install_new_payload_from_meta (snmp_meta=0x7eee81c0, pkt=0x0, entry=0x7d4f4e58) at /home/sgillibr/savvi-dc-snmp/recipies.c:187 
(gdb) timeme 100000 
***long*** 
580000 cycles, 0.580000 seconds 
(gdb) 

जाहिर संकल्प कुछ की जरूरत के लिए पर्याप्त नहीं हो सकता है, हालांकि यह बहुत उपयोगी साबित करता है: सहायक जो अगले कदम निष्पादित करेंगे और समय जानकारी देने चलाते हैं।

+0

मैंने इसे सी फ़ाइल में नींद() फ़ंक्शन के लिए करने की कोशिश की, यह काम नहीं कर रहा है, परिणाम हमेशा 0 होता है। – CodyChan

1

इसे अपने ~/में रखें।gdbinit

define timeme 
    python import time 
    python starttime=time.time() 
    next 
    python print("Previous takes: " + (str)(time.time()-starttime) + "s") 
end 
document timeme 
    Measure executing time of next function 
    Usage: timeme or ti 
end 

प्रकार timeme या ti जब आप अगली समारोह के समय को मापने के लिए चाहते हैं।