C++ कोड प्रोफाइलिंग: शुरुआती लोगों के लिए बाधाएं खोजना

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

परिचय: C++ कोड को प्रोफाइल करना क्यों महत्वपूर्ण है?

\n

C++ सबसे तेज़ प्रोग्रामिंग भाषाओं में से एक है, लेकिन इसमें भी धीमा कोड लिखा जा सकता है। अक्सर डेवलपर्स अंतर्ज्ञान के आधार पर प्रोग्राम के गलत हिस्सों को अनुकूलित करने में घंटों बिता देते हैं। प्रोफाइलिंग अनुकूलन के लिए एक वैज्ञानिक दृष्टिकोण है: आप मापते हैं कि प्रोग्राम अपना अधिकांश समय कहाँ बिताता है, और उन स्थानों को लक्षित करके सुधारते हैं।

\n

शुरुआती C++ प्रोग्रामर के लिए, प्रोफाइलिंग जटिल लग सकती है, लेकिन वास्तव में बुनियादी उपकरण एक शाम में सीखे जा सकते हैं। इस लेख में, हम तीन लोकप्रिय उपकरणों पर चर्चा करेंगे: gprof, perf और Valgrind, और उनके परिणामों की व्याख्या करना सीखेंगे।

\n\n

प्रोफाइलिंग क्या है और इसके कौन से तरीके हैं?

\n

प्रोफाइलिंग प्रोग्राम के निष्पादन के दौरान उसके कार्य के बारे में डेटा एकत्र करना है। दो मुख्य दृष्टिकोण हैं:

\n
    \n
  • इंस्ट्रूमेंटिंग प्रोफाइलिंग — प्रोग्राम कोड में विशेष "जांच" जोड़ी जाती हैं (जैसे, gprof)। नुकसान: प्रोग्राम के निष्पादन को धीमा कर देता है।
  • \n
  • सैंपलिंग प्रोफाइलिंग — नियमित अंतराल पर प्रोग्राम में "झांकता" है और रिकॉर्ड करता है कि वर्तमान में कौन सा फंक्शन चल रहा है (जैसे, perf)। प्रोग्राम को लगभग धीमा नहीं करता।
  • \n
\n

मेमोरी लीक (Valgrind) और कैश विश्लेषण खोजने के लिए भी उपकरण हैं। शुरुआत के लिए gprof और perf सीखना पर्याप्त है।

\n\n

उपकरण 1: gprof — प्रोफाइलिंग का क्लासिक

\n

gprof GCC के लिए एक अंतर्निहित प्रोफाइलर है। यह दो चरणों में काम करता है: डेटा संग्रह और उसका विश्लेषण।

\n

gprof का उपयोग कैसे करें

\n

पहले प्रोग्राम को -pg फ्लैग के साथ कंपाइल करें:

\n
g++ -pg -o my_program my_program.cpp
\n

प्रोग्राम चलाएं:

\n
./my_program
\n

निष्पादन के बाद, gmon.out फ़ाइल दिखाई देगी। अब gprof चलाएं:

\n
gprof my_program gmon.out > report.txt
\n

report.txt खोलें और तालिका देखें:

\n
Flat profile:\nEach sample counts as 0.01 seconds.\n  %   cumulative   self              self     total\n time   seconds   seconds    calls  ms/call  ms/call  name\n 60.00      0.06     0.06    10000     0.01     0.01  slow_function\n 30.00      0.09     0.03     5000     0.01     0.02  medium_function\n 10.00      0.10     0.01        1    10.00    10.00  main
\n

% time कॉलम में दिखाया गया है कि फंक्शन ने कितने प्रतिशत समय लिया। हमारे उदाहरण में, slow_function अनुकूलन के लिए मुख्य उम्मीदवार है।

\n

सुझाव: छोटे प्रोग्राम के लिए gprof बहुत उपयुक्त है। बड़े प्रोजेक्ट के लिए, कंपाइलर अनुकूलन के कारण यह गलत डेटा दे सकता है।

\n\n

उपकरण 2: perf — Linux के लिए शक्तिशाली सैंपलर

\n

perf एक प्रोफाइलर है जो Linux कर्नेल में निर्मित है। यह सैंपलिंग विधि से काम करता है और प्रोग्राम को लगभग धीमा नहीं करता। production-सिस्टम के लिए आदर्श है।

\n

perf का बुनियादी उपयोग

\n

प्रोग्राम को डीबग प्रतीकों (-g फ्लैग) के साथ कंपाइल करें:

\n
g++ -g -o my_program my_program.cpp
\n

प्रोफाइलिंग चलाएं:

\n
perf record ./my_program
\n

प्रोग्राम पूरा होने के बाद, रिपोर्ट देखें:

\n
perf report
\n

आपको एक इंटरैक्टिव इंटरफ़ेस दिखाई देगा। किसी फंक्शन पर क्लिक करके, आप देख सकते हैं कि कोड की कौन सी पंक्तियाँ सबसे अधिक बार निष्पादित हुईं। आउटपुट का उदाहरण:

\n
Samples: 1K of event 'cycles'\nEvent count (approx.): 250000000\nOverhead  Command      Shared Object     Symbol\n  45.32%  my_program   my_program        [.] slow_function\n  30.15%  my_program   my_program        [.] medium_function\n  12.50%  my_program   libc-2.31.so      [.] malloc\n   8.03%  my_program   my_program        [.] main
\n

महत्वपूर्ण: perf को कर्नेल डेटा एकत्र करने के लिए रूट अधिकारों की आवश्यकता होती है।

ब्लॉग

पुस्तक अनुशंसाएँ