मैं कुछ सीपीयू गहन अनुप्रयोगों को प्रोफाइल करने के लिए 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()
अद्यतन: मैं बढ़ावा :: टाइमर का उपयोग समय शुरू जहां प्रोफाइलर शुरू होता है और समाप्त होने के जहां यह समाप्त होता है। मैं थ्रेड या कुछ भी फैंसी का उपयोग नहीं करता।
आप रनटाइम को कैसे मापते हैं? दोनों विन्यास के लिए "समय ./yourprogramm" करें। क्या आप मल्टीथ्रेडिंग का उपयोग करते हैं? – ebo
समय के साथ एक रन और माप sys/usr समय करो। प्रोफाइलर संख्या इंगित करती है कि आउटपुट के बिना आपके पास 40% कम रनटाइम होना चाहिए। सबसे आसान स्पष्टीकरण यह होगा कि प्रोफाइलर माप कम हो गया है। – ebo
यह सब उपयोगकर्ता में है। मैं जो कर रहा हूं वह बहुत आसान है, मुझे लगता है ... क्या तथ्य यह है कि फाइल पूरी तरह से खुली है? – Tristan