परिचय: C++ कोड को प्रोफाइल करना क्यों महत्वपूर्ण है?
\nC++ सबसे तेज़ प्रोग्रामिंग भाषाओं में से एक है, लेकिन इसमें भी धीमा कोड लिखा जा सकता है। अक्सर डेवलपर्स अंतर्ज्ञान के आधार पर प्रोग्राम के गलत हिस्सों को अनुकूलित करने में घंटों बिता देते हैं। प्रोफाइलिंग अनुकूलन के लिए एक वैज्ञानिक दृष्टिकोण है: आप मापते हैं कि प्रोग्राम अपना अधिकांश समय कहाँ बिताता है, और उन स्थानों को लक्षित करके सुधारते हैं।
\nशुरुआती C++ प्रोग्रामर के लिए, प्रोफाइलिंग जटिल लग सकती है, लेकिन वास्तव में बुनियादी उपकरण एक शाम में सीखे जा सकते हैं। इस लेख में, हम तीन लोकप्रिय उपकरणों पर चर्चा करेंगे: gprof, perf और Valgrind, और उनके परिणामों की व्याख्या करना सीखेंगे।
प्रोफाइलिंग क्या है और इसके कौन से तरीके हैं?
\nप्रोफाइलिंग प्रोग्राम के निष्पादन के दौरान उसके कार्य के बारे में डेटा एकत्र करना है। दो मुख्य दृष्टिकोण हैं:
\n- \n
- इंस्ट्रूमेंटिंग प्रोफाइलिंग — प्रोग्राम कोड में विशेष "जांच" जोड़ी जाती हैं (जैसे,
gprof)। नुकसान: प्रोग्राम के निष्पादन को धीमा कर देता है। \n - सैंपलिंग प्रोफाइलिंग — नियमित अंतराल पर प्रोग्राम में "झांकता" है और रिकॉर्ड करता है कि वर्तमान में कौन सा फंक्शन चल रहा है (जैसे,
perf)। प्रोग्राम को लगभग धीमा नहीं करता। \n
मेमोरी लीक (Valgrind) और कैश विश्लेषण खोजने के लिए भी उपकरण हैं। शुरुआत के लिए gprof और perf सीखना पर्याप्त है।
उपकरण 1: gprof — प्रोफाइलिंग का क्लासिक
\ngprof GCC के लिए एक अंतर्निहित प्रोफाइलर है। यह दो चरणों में काम करता है: डेटा संग्रह और उसका विश्लेषण।
gprof का उपयोग कैसे करें
\nपहले प्रोग्राम को -pg फ्लैग के साथ कंपाइल करें:
g++ -pg -o my_program my_program.cpp\nप्रोग्राम चलाएं:
\n./my_program\nनिष्पादन के बाद, gmon.out फ़ाइल दिखाई देगी। अब gprof चलाएं:
gprof my_program gmon.out > report.txt\nreport.txt खोलें और तालिका देखें:
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 अनुकूलन के लिए मुख्य उम्मीदवार है।
सुझाव: छोटे प्रोग्राम के लिए gprof बहुत उपयुक्त है। बड़े प्रोजेक्ट के लिए, कंपाइलर अनुकूलन के कारण यह गलत डेटा दे सकता है।
उपकरण 2: perf — Linux के लिए शक्तिशाली सैंपलर
\nperf एक प्रोफाइलर है जो Linux कर्नेल में निर्मित है। यह सैंपलिंग विधि से काम करता है और प्रोग्राम को लगभग धीमा नहीं करता। production-सिस्टम के लिए आदर्श है।
perf का बुनियादी उपयोग
\nप्रोग्राम को डीबग प्रतीकों (-g फ्लैग) के साथ कंपाइल करें:
g++ -g -o my_program my_program.cpp\nप्रोफाइलिंग चलाएं:
\nperf record ./my_program\nप्रोग्राम पूरा होने के बाद, रिपोर्ट देखें:
\nperf report\nआपको एक इंटरैक्टिव इंटरफ़ेस दिखाई देगा। किसी फंक्शन पर क्लिक करके, आप देख सकते हैं कि कोड की कौन सी पंक्तियाँ सबसे अधिक बार निष्पादित हुईं। आउटपुट का उदाहरण:
\nSamples: 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 को कर्नेल डेटा एकत्र करने के लिए रूट अधिकारों की आवश्यकता होती है।