परिचय: C++ कोड को प्रोफाइल क्यों करें?
\n\nमाप के बिना अनुकूलन अनुमान लगाने जैसा है। अनुभवी डेवलपर्स भी अक्सर यह अनुमान लगाने में गलती करते हैं कि कोड का कौन सा भाग सबसे धीमा चल रहा है। प्रोफाइलिंग इस प्रश्न का उत्तर देने का एकमात्र वैज्ञानिक तरीका है: "प्रोग्राम वास्तव में सबसे अधिक समय कहाँ बिताता है?"
\n\nइस लेख में, हम Linux पर C++ कोड के प्रोफाइलिंग के लिए व्यावहारिक उपकरणों पर चर्चा करेंगे: gprof, perf और Valgrind (Callgrind)। आप सीखेंगे कि प्रोफाइलर कैसे चलाएं, उनकी रिपोर्ट की व्याख्या कैसे करें और वास्तविक अड़चनें कैसे खोजें।
1. gprof के साथ प्रोफाइलिंग
\n\nकोड तैयार करना
\n\ngprof सबसे सरल और सुलभ प्रोफाइलर है। इसके काम करने के लिए, प्रोग्राम को -pg फ्लैग के साथ कंपाइल करना होगा:
g++ -pg -O2 main.cpp -o my_program\n\nप्रोग्राम चलाएं। यह सामान्य से थोड़ा धीमा चलेगा, लेकिन प्रोफाइलिंग डेटा के साथ gmon.out फ़ाइल बनाएगा। फिर gprof चलाएं:
./my_program\ngprof my_program gmon.out > report.txt\n\nविश्लेषण का उदाहरण
\n\nदो फ़ंक्शन वाले एक सरल प्रोग्राम पर विचार करें:
\n\n#include <iostream>\n#include <cmath>\n\nvoid slowFunction() {\n double sum = 0.0;\n for (int i = 0; i < 100000000; ++i) {\n sum += std::sin(i) * std::cos(i);\n }\n std::cout << "Sum: " << sum << std::endl;\n}\n\nvoid fastFunction() {\n int count = 0;\n for (int i = 0; i < 1000; ++i) {\n for (int j = 0; j < 1000; ++j) {\n count += (i * j) % 3;\n }\n }\n std::cout << "Count: " << count << std::endl;\n}\n\nint main() {\n slowFunction();\n fastFunction();\n return 0;\n}\n\ngprof चलाने के बाद, रिपोर्ट में हम प्रत्येक फ़ंक्शन के निष्पादन समय के साथ एक तालिका देखेंगे:
Flat profile:\n\nEach sample counts as 0.01 seconds.\n % cumulative self self total\n time seconds seconds calls ms/call ms/call name\n 99.0 1.98 1.98 1 1980.0 1980.0 slowFunction()\n 1.0 0.02 0.02 1 20.0 20.0 fastFunction()\n\nनिष्कर्ष स्पष्ट है: slowFunction() 99% समय लेता है। अड़चन लूप में त्रिकोणमितीय फ़ंक्शन sin और cos का कॉल है।
gprof की सीमाएँ
\n\n- \n
- केवल
-pgके साथ कंपाइल किए गए प्रोग्राम के साथ काम करता है \n - inline फ़ंक्शन में समय नहीं दिखाता \n
- मल्टीथ्रेडेड एप्लिकेशन के लिए उपयुक्त नहीं है (अतिरिक्त सेटिंग्स के बिना) \n
2. perf (Linux) के साथ प्रोफाइलिंग
\n\nबेसिक रन
\n\nperf कर्नेल स्तर पर प्रोफाइलिंग के लिए एक शक्तिशाली उपकरण है। इसे प्रोग्राम को पुनः कंपाइल करने की आवश्यकता नहीं है और यह किसी भी बाइनरी के साथ काम करता है (यहां तक कि -O3 ऑप्टिमाइज़ेशन के साथ भी):
# इंस्टॉलेशन (यदि नहीं है)\nsudo apt install linux-tools-common linux-tools-generic\n\n# CPU साइकिल गिनती के साथ प्रोफाइलिंग\nperf stat ./my_program\n\n# विस्तृत विश्लेषण के लिए इवेंट रिकॉर्ड करना\nperf record ./my_program\nperf report\n\nperf stat के साथ उदाहरण
\n\nउसी प्रोग्राम के लिए, perf stat दिखाएगा:
Performance counter stats for './my_program':\n\n 1,987.45 msec task-clock # 1.000 CPUs utilized\n 10 context-switches # 5.028 /sec\n 0 cpu-migrations # 0.000 /sec\n 105 page-faults # 52.832 /sec\n 5,234,567,890 cycles # 2.634 GHz\n 9,876,543,210 instructions # 1.89 insn per cycle\n 1,234,567,890 branches # 621.234 M/sec\n 10,000,000 branch-misses # 0.81% of all branches\n\n 1.987456789 seconds time elapsed\n\nमुख्य मी