2009-06-16 9 views
8

मैं कुछ सीपीयू गहन अनुप्रयोगों को प्रोफाइल करने के लिए Google परफ टूल्स के साथ शुरुआत करने की कोशिश कर रहा हूं। यह एक सांख्यिकीय गणना है जो प्रत्येक चरण को 'ऑफस्ट्रीम' का उपयोग करके फ़ाइल में डंप करती है। मैं एक सी ++ विशेषज्ञ नहीं हूं इसलिए मुझे बाधा खोजने में परेशानी हो रही है। मेरा पहला पास परिणाम देता है:सी ++ प्रोफाइलिंग (गूगल सीपीयू परफ टूल्स) माप वास्तव में क्या करता है?

 
Total: 857 samples 
    357 41.7% 41.7%  357 41.7% _write$UNIX2003 
    134 15.6% 57.3%  134 15.6% _exp$fenv_access_off 
    109 12.7% 70.0%  276 32.2% scythe::dnorm 
    103 12.0% 82.0%  103 12.0% _log$fenv_access_off 
     58 6.8% 88.8%  58 6.8% scythe::const_matrix_forward_iterator::operator* 
     37 4.3% 93.1%  37 4.3% scythe::matrix_forward_iterator::operator* 
     15 1.8% 94.9%  47 5.5% std::transform 
     13 1.5% 96.4%  486 56.7% SliceStep::DoStep 
     10 1.2% 97.5%  10 1.2% 0x0002726c 
     5 0.6% 98.1%  5 0.6% 0x000271c7 
     5 0.6% 98.7%  5 0.6% _write$NOCANCEL$UNIX2003 

यह आश्चर्य की बात है, क्योंकि सभी वास्तविक गणना स्लाइसस्टेप :: DoStep में होती है। "_write $ UNIX2003" (मुझे यह कहां मिल सकता है कि यह क्या है?) आउटपुट फ़ाइल लिखने से आ रहा है। अब, मुझे क्या भ्रमित करता है कि अगर मैं सभी outfile << "text" कथनों को दबाता हूं और पप्रोफ चलाता हूं, तो 95% SliceStep::DoStep में है और `_write $ UNIX2003 'चला जाता है। हालांकि मेरा आवेदन कुल समय के अनुसार मापा नहीं जाता है। पूरी चीज 1 प्रतिशत से भी कम हो जाती है।

मुझे क्या याद आ रही है?

जोड़ा गया: outfile << बयान बिना pprof उत्पादन होता है:

 
Total: 790 samples 
    205 25.9% 25.9%  205 25.9% _exp$fenv_access_off 
    170 21.5% 47.5%  170 21.5% _log$fenv_access_off 
    162 20.5% 68.0%  437 55.3% scythe::dnorm 
     83 10.5% 78.5%  83 10.5% scythe::const_matrix_forward_iterator::operator* 
     70 8.9% 87.3%  70 8.9% scythe::matrix_forward_iterator::operator* 
     28 3.5% 90.9%  78 9.9% std::transform 
     26 3.3% 94.2%  26 3.3% 0x00027262 
     12 1.5% 95.7%  12 1.5% _write$NOCANCEL$UNIX2003 
     11 1.4% 97.1%  764 96.7% SliceStep::DoStep 
     9 1.1% 98.2%  9 1.1% 0x00027253 
     6 0.8% 99.0%  6 0.8% 0x000274a6 

यह, मैं क्या उम्मीद थी की तरह लग रहा सिवाय मैं प्रदर्शन में नहीं दिखाई वृद्धि (एक 10 सेकंड गणना पर .1 सेकंड) को देखने के । कोड अनिवार्य है:

ofstream outfile("out.txt"); 
for loop: 
    SliceStep::DoStep() 
    outfile << 'result' 
outfile.close() 

अद्यतन: मैं बढ़ावा :: टाइमर का उपयोग समय शुरू जहां प्रोफाइलर शुरू होता है और समाप्त होने के जहां यह समाप्त होता है। मैं थ्रेड या कुछ भी फैंसी का उपयोग नहीं करता।

+0

आप रनटाइम को कैसे मापते हैं? दोनों विन्यास के लिए "समय ./yourprogramm" करें। क्या आप मल्टीथ्रेडिंग का उपयोग करते हैं? – ebo

+0

समय के साथ एक रन और माप sys/usr समय करो। प्रोफाइलर संख्या इंगित करती है कि आउटपुट के बिना आपके पास 40% कम रनटाइम होना चाहिए। सबसे आसान स्पष्टीकरण यह होगा कि प्रोफाइलर माप कम हो गया है। – ebo

+0

यह सब उपयोगकर्ता में है। मैं जो कर रहा हूं वह बहुत आसान है, मुझे लगता है ... क्या तथ्य यह है कि फाइल पूरी तरह से खुली है? – Tristan

उत्तर

3

मेरी टिप्पणी से:

नंबर आप अपने प्रोफाइलर से प्राप्त कर कहते हैं, कार्यक्रम लगभग 40% प्रिंट बयान के बिना तेजी से होना चाहिए।

हालांकि, रनटाइम लगभग समान रहता है।

स्पष्ट रूप से मापों में से एक गलत होना चाहिए। इसका मतलब है कि आपको और अधिक बेहतर माप करना है।

सबसे पहले मैं एक और आसान टूल से शुरू करने का सुझाव देता हूं: टाइम कमांड। यह आपको एक अजीब विचार मिलना चाहिए जहां आपका समय व्यतीत होता है।

परिणाम अभी भी निर्णायक नहीं हैं, तो आप एक बेहतर testcase की जरूरत है:

  • एक बड़ा समस्या
  • का उपयोग को मापने से पहले एक वार्मअप करते हैं। कुछ लूप करें और बाद में किसी भी माप शुरू करें (उसी प्रक्रिया में)।

Tiristan: यह सभी उपयोगकर्ता में है। मैं जो कर रहा हूं वह बहुत आसान है, मुझे लगता है ...क्या तथ्य यह है कि फ़ाइल पूरी तरह से खुला है, कुछ भी मतलब है?

इसका मतलब है कि प्रोफाइलर गलत है।

मुद्रण सांत्वना की तरह कुछ में अजगर परिणामों का उपयोग करने के लिए 100000 लाइनों:

for i in xrange(100000): 
    print i 

सांत्वना के लिए:

time python print.py 
[...] 
real 0m2.370s 
user 0m0.156s 
sys  0m0.232s 

बनाम:

time python test.py > /dev/null 

real 0m0.133s 
user 0m0.116s 
sys  0m0.008s 

मेरे बिंदु है: आपका आंतरिक उपाय ents और समय दिखाता है कि आपको आउटपुट अक्षम करने से कुछ भी प्राप्त नहीं होता है। Google परफ टूल्स का कहना है कि आपको चाहिए। कौन गलत है

+0

ऑपरेशन निश्चित रूप से स्लाइस :: DoStep फ़ंक्शन के पास 10 सेकंड लेता है। मुझे समझ में नहीं आता कि _write कैसे जा सकता है, 40% होने के बाद, और इसका कोई प्रभाव नहीं पड़ता ... – Tristan

+0

यही बात है। एक नंबर गलत होना चाहिए। पता लगाएं कि कौन सा है। प्रोफाइलर जेनरेट की संख्या सांख्यिकीय रूप से महत्वपूर्ण या सादा गलत नहीं हो सकती है। – ebo

1

_write $ UNIX2003 शायद write पॉज़िक्स सिस्टम कॉल का जिक्र कर रहा है, जो टर्मिनल पर आउटपुट करता है। I/O लगभग किसी और चीज की तुलना में बहुत धीमी है, इसलिए यह समझ में आता है कि यदि आप आउटपुट का उचित हिस्सा लिख ​​रहे हैं तो आपका प्रोग्राम बहुत समय व्यतीत कर रहा है।

मुझे यकीन नहीं है कि आउटपुट हटाने पर आपका प्रोग्राम क्यों तेज़ नहीं होगा, लेकिन मैं वास्तव में आपके द्वारा दी गई जानकारी पर अनुमान नहीं लगा सकता। कोउट कथन हटा दिए जाने पर कुछ कोड, या यहां तक ​​कि perftools आउटपुट देखना अच्छा लगेगा।

1

Google perftools कॉल स्टैक के नमूने एकत्र करता है, इसलिए आपको उन चीज़ों में कुछ दृश्यता प्राप्त करने की आवश्यकता है।

दस्तावेज़ के अनुसार, आप कथन या पते ग्रैन्युलरिटी पर कॉल ग्राफ़ प्रदर्शित कर सकते हैं। आपको यह बताना चाहिए कि आपको क्या जानना है।

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