खोज…
Gcc और gprof के साथ प्रोफाइलिंग
GNU gprof प्रोफाइलर, gprof , आपको अपना कोड प्रोफाइल करने की अनुमति देता है। इसका उपयोग करने के लिए, आपको निम्नलिखित चरण करने होंगे:
रूपरेखा जानकारी तैयार करने के लिए सेटिंग के साथ एप्लिकेशन बनाएं
निर्मित एप्लिकेशन चलाकर प्रोफाइलिंग जानकारी उत्पन्न करें
ग्रेफाइट के साथ उत्पन्न प्रोफाइलिंग जानकारी देखें
रूपरेखा जानकारी तैयार करने के लिए सेटिंग्स के साथ एप्लिकेशन बनाने के लिए, हम -pg
फ्लैग जोड़ते हैं। इसलिए, उदाहरण के लिए, हम उपयोग कर सकते हैं
$ gcc -pg *.cpp -o app
या
$ gcc -O2 -pg *.cpp -o app
इत्यादि।
एक बार app
, app
कहें, बनाया गया है, इसे हमेशा की तरह निष्पादित करें:
$ ./app
यह gmon.out
नामक एक फ़ाइल का उत्पादन करना चाहिए।
प्रोफाइलिंग परिणाम देखने के लिए, अब दौड़ें
$ gprof app gmon.out
(ध्यान दें कि हम दोनों एप्लिकेशन और साथ ही उत्पन्न आउटपुट प्रदान करते हैं)।
बेशक, आप पाइप या रीडायरेक्ट भी कर सकते हैं:
$ gprof app gmon.out | less
इत्यादि।
अंतिम कमांड का परिणाम एक तालिका होनी चाहिए, जिसकी पंक्तियाँ फ़ंक्शन हैं, और जिनके कॉलम में कॉल की संख्या, कुल समय व्यतीत, स्व समय व्यतीत करने का संकेत है (यानी, बच्चों को कॉल को छोड़कर फ़ंक्शन में बिताया गया समय)।
Gperf2dot के साथ कॉलग्राफ आरेख उत्पन्न करना
अधिक जटिल अनुप्रयोगों के लिए, फ्लैट निष्पादन प्रोफाइल का पालन करना मुश्किल हो सकता है। यही कारण है कि कई प्रोफाइलिंग उपकरण एनोटेटेड कॉलग्राफ जानकारी के कुछ रूप भी उत्पन्न करते हैं।
gperf2dot टेक्स्ट आउटपुट को कई प्रोफाइल्स (Linux perf, callgrind, oprofile आदि) से कॉलग्राफ आरेख में परिवर्तित करता है। आप इसे अपना प्रोफाइलर चलाकर उपयोग कर सकते हैं (उदाहरण के लिए gprof
):
# compile with profiling flags
g++ *.cpp -pg
# run to generate profiling data
./main
# translate profiling data to text, create image
gprof ./main | gprof2dot -s | dot -Tpng -o output.png
Gcc और Google परफ़ॉर्म टूल्स के साथ सीपीयू उपयोग प्रोफाइलिंग
Google परफ़ॉर्म टूल्स एक CPU प्रोफाइलर प्रदान करता है, जिसमें थोड़ा मित्रवत इंटरफ़ेस है। इसके प्रयेाग के लिए:
- Google Perf Tools इंस्टॉल करें
- हमेशा की तरह अपना कोड संकलित करें
- रनटाइम के दौरान अपने लाइब्रेरी लोड पथ में
libprofiler
प्रोफाइलर लाइब्रेरी जोड़ें - एक फ्लैट निष्पादन प्रोफ़ाइल, या एक कॉलग्राफ़ आरेख उत्पन्न करने के लिए
pprof
का उपयोग करें
उदाहरण के लिए:
# compile code
g++ -O3 -std=c++11 main.cpp -o main
# run with profiler
LD_PRELOAD=/usr/local/lib/libprofiler.so CPUPROFILE=main.prof CPUPROFILE_FREQUENCY=100000 ./main
कहाँ पे:
-
CPUPROFILE
प्रोफाइलिंग डेटा के लिए आउटपुट फ़ाइल को इंगित करता है -
CPUPROFILE_FREQUENCY
प्रोफाइलर नमूनाकरण आवृत्ति को इंगित करता है;
प्रोफाइलिंग डेटा को पोस्ट-प्रोसेस करने के लिए pprof
का उपयोग करें।
आप पाठ के रूप में एक फ्लैट कॉल प्रोफ़ाइल उत्पन्न कर सकते हैं:
$ pprof --text ./main main.prof
PROFILE: interrupts/evictions/bytes = 67/15/2016
pprof --text --lines ./main main.prof
Using local file ./main.
Using local file main.prof.
Total: 67 samples
22 32.8% 32.8% 67 100.0% longRunningFoo ??:0
20 29.9% 62.7% 20 29.9% __memmove_ssse3_back /build/eglibc-3GlaMS/eglibc-2.19/string/../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:1627
4 6.0% 68.7% 4 6.0% __memmove_ssse3_back /build/eglibc-3GlaMS/eglibc-2.19/string/../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:1619
3 4.5% 73.1% 3 4.5% __random_r /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random_r.c:388
3 4.5% 77.6% 3 4.5% __random_r /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random_r.c:401
2 3.0% 80.6% 2 3.0% __munmap /build/eglibc-3GlaMS/eglibc-2.19/misc/../sysdeps/unix/syscall-template.S:81
2 3.0% 83.6% 12 17.9% __random /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random.c:298
2 3.0% 86.6% 2 3.0% __random_r /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random_r.c:385
2 3.0% 89.6% 2 3.0% rand /build/eglibc-3GlaMS/eglibc-2.19/stdlib/rand.c:26
1 1.5% 91.0% 1 1.5% __memmove_ssse3_back /build/eglibc-3GlaMS/eglibc-2.19/string/../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:1617
1 1.5% 92.5% 1 1.5% __memmove_ssse3_back /build/eglibc-3GlaMS/eglibc-2.19/string/../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:1623
1 1.5% 94.0% 1 1.5% __random /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random.c:293
1 1.5% 95.5% 1 1.5% __random /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random.c:296
1 1.5% 97.0% 1 1.5% __random_r /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random_r.c:371
1 1.5% 98.5% 1 1.5% __random_r /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random_r.c:381
1 1.5% 100.0% 1 1.5% rand /build/eglibc-3GlaMS/eglibc-2.19/stdlib/rand.c:28
0 0.0% 100.0% 67 100.0% __libc_start_main /build/eglibc-3GlaMS/eglibc-2.19/csu/libc-start.c:287
0 0.0% 100.0% 67 100.0% _start ??:0
0 0.0% 100.0% 67 100.0% main ??:0
0 0.0% 100.0% 14 20.9% rand /build/eglibc-3GlaMS/eglibc-2.19/stdlib/rand.c:27
0 0.0% 100.0% 27 40.3% std::vector::_M_emplace_back_aux ??:0
... या आप एक पीडीएफ में एनोटेट कॉलगर्ल उत्पन्न कर सकते हैं:
pprof --pdf ./main main.prof > out.pdf