C++ कोड का प्रोफाइलिंग: व्यवहार में अड़चनें खोजना

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

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

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

परिचय: C++ कोड को प्रोफाइल क्यों करें?

\n\n

माप के बिना अनुकूलन अनुमान लगाने जैसा है। अनुभवी डेवलपर्स भी अक्सर यह अनुमान लगाने में गलती करते हैं कि कोड का कौन सा भाग सबसे धीमा चल रहा है। प्रोफाइलिंग इस प्रश्न का उत्तर देने का एकमात्र वैज्ञानिक तरीका है: "प्रोग्राम वास्तव में सबसे अधिक समय कहाँ बिताता है?"

\n\n

इस लेख में, हम Linux पर C++ कोड के प्रोफाइलिंग के लिए व्यावहारिक उपकरणों पर चर्चा करेंगे: gprof, perf और Valgrind (Callgrind)। आप सीखेंगे कि प्रोफाइलर कैसे चलाएं, उनकी रिपोर्ट की व्याख्या कैसे करें और वास्तविक अड़चनें कैसे खोजें।

\n\n

1. gprof के साथ प्रोफाइलिंग

\n\n

कोड तैयार करना

\n\n

gprof सबसे सरल और सुलभ प्रोफाइलर है। इसके काम करने के लिए, प्रोग्राम को -pg फ्लैग के साथ कंपाइल करना होगा:

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

प्रोग्राम चलाएं। यह सामान्य से थोड़ा धीमा चलेगा, लेकिन प्रोफाइलिंग डेटा के साथ gmon.out फ़ाइल बनाएगा। फिर gprof चलाएं:

\n\n
./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\n

gprof चलाने के बाद, रिपोर्ट में हम प्रत्येक फ़ंक्शन के निष्पादन समय के साथ एक तालिका देखेंगे:

\n\n
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 का कॉल है।

\n\n

gprof की सीमाएँ

\n\n
    \n
  • केवल -pg के साथ कंपाइल किए गए प्रोग्राम के साथ काम करता है
  • \n
  • inline फ़ंक्शन में समय नहीं दिखाता
  • \n
  • मल्टीथ्रेडेड एप्लिकेशन के लिए उपयुक्त नहीं है (अतिरिक्त सेटिंग्स के बिना)
  • \n
\n\n

2. perf (Linux) के साथ प्रोफाइलिंग

\n\n

बेसिक रन

\n\n

perf कर्नेल स्तर पर प्रोफाइलिंग के लिए एक शक्तिशाली उपकरण है। इसे प्रोग्राम को पुनः कंपाइल करने की आवश्यकता नहीं है और यह किसी भी बाइनरी के साथ काम करता है (यहां तक कि -O3 ऑप्टिमाइज़ेशन के साथ भी):

\n\n
# इंस्टॉलेशन (यदि नहीं है)\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\n

perf stat के साथ उदाहरण

\n\n

उसी प्रोग्राम के लिए, perf stat दिखाएगा:

\n\n
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

मुख्य मी

ब्लॉग

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