ලිනක්ස් මත ධාවනය වන සී ++ කේතය පැතිකඩ කරන්නේ කෙසේද?


1829

මා සතුව C ++ යෙදුමක් ඇත, එය ලිනක්ස් මත ධාවනය වන අතර එය මම ප්‍රශස්තිකරණය කරමින් සිටිමි. මගේ කේතයේ කුමන අංශ සෙමින් ක්‍රියාත්මක වේදැයි හඳුනා ගන්නේ කෙසේද?


28
ඔබේ සංවර්ධන තොගය පිළිබඳ වැඩි දත්ත ඔබ ලබා දෙන්නේ නම් ඔබට වඩා හොඳ පිළිතුරු ලැබෙනු ඇත. ඉන්ටෙල් සහ සන් වෙතින් පැතිකඩ ඇති නමුත් ඔබ ඔවුන්ගේ සම්පාදකයින් භාවිතා කළ යුතුය. එය විකල්පයක් ද?
නස්ගොබ්

2
එයට දැනටමත් පහත සබැඳියෙන් පිළිතුරු ලබා දී ඇත: stackoverflow.com/questions/2497211/…
කපිල් ගුප්තා

5
බොහෝ පිළිතුරු codeපැතිකඩයන් ය. කෙසේ වෙතත්, ප්‍රමුඛතා ප්‍රතිලෝම, හැඹිලි අන්වර්ථකරණය, සම්පත් විවාද ආදිය ප්‍රශස්තිකරණයට හා ක්‍රියාකාරීත්වයට සාධක විය හැකිය. මම හිතන්නේ මිනිස්සු මගේ මන්දගාමී කේතයට තොරතුරු කියවනවා . නිති අසන පැන මෙම ත්‍රෙඩ් එක යොමු කරයි.
කලාත්මක ශබ්දය


3
මම අහඹු ලෙස pstack භාවිතා කළෙමි, බොහෝ විට වැඩසටහන වැඩිපුරම පවතින සාමාන්‍ය තොගය මුද්‍රණය කරනු ඇත, එබැවින් බාධකයට යොමු වේ.
ජෝස් මැනුවෙල් ගෝමස් අල්වරෙස්

Answers:


1418

ඔබේ ඉලක්කය පැතිකඩක් භාවිතා කිරීම නම්, යෝජිත එකක් භාවිතා කරන්න.

කෙසේ වෙතත්, ඔබ කඩිමුඩියේ සිටී නම් සහ ඔබේ වැඩසටහන විෂබීජහරණය යටතේ අතින් බාධා කළ හැකි නම් එය විෂයානුබද්ධව මන්දගාමී වේ නම්, කාර්ය සාධන ගැටළු සොයා ගැනීමට සරල ක්‍රමයක් තිබේ.

කිහිප වතාවක්ම එය නවත්වන්න, සෑම අවස්ථාවකදීම ඇමතුම් තොගය දෙස බලන්න. යම් කාල පරිච්ඡේදයක්, 20% ක් හෝ 50% ක් හෝ වෙනත් දෙයක් නාස්ති කරන යම් කේතයක් තිබේ නම්, එය එක් එක් නියැදියක ක්‍රියාවෙන් ඔබ එය අල්ලා ගැනීමේ සම්භාවිතාවයි. ඉතින්, එය දළ වශයෙන් ඔබ දකින සාම්පලවල ප්‍රතිශතයයි. උගත් අනුමාන කිරීමක් අවශ්‍ය නොවේ. ගැටලුව කුමක්දැයි ඔබට අනුමාන කිරීමක් තිබේ නම්, මෙය එය සනාථ කරනු ඇත හෝ සනාථ කරනු ඇත.

ඔබට විවිධ ප්‍රමාණයේ කාර්ය සාධන ගැටළු කිහිපයක් තිබිය හැක. ඔබ ඒවායින් එකක් පිරිසිදු කළ හොත්, ඉතිරි ඒවා විශාල ප්‍රතිශතයක් ගනු ඇති අතර, පසුව ලැබෙන අවසර පත්‍රවල පහසුවෙන් හඳුනාගත හැකිය. මෙම විශාලන ආචරණය , බහුවිධ ගැටලු සමඟ සංයුක්ත වූ විට, සැබවින්ම දැවැන්ත වේගවත් සාධකවලට තුඩු දිය හැකිය.

Caveat : ක්‍රමලේඛකයින් මෙම තාක්ෂණය තමන් විසින්ම භාවිතා කර නොමැති නම් ඒවා ගැන සැක පහළ කරයි. පැතිකඩයන් ඔබට මෙම තොරතුරු ලබා දෙන බව ඔවුන් කියනු ඇත, නමුත් එය සත්‍ය වන්නේ ඔවුන් සම්පූර්ණ ඇමතුම් තොගය සාම්පල ලබා ගන්නේ නම් පමණි, ඉන්පසු අහඹු නියැදි කට්ටලයක් පරීක්ෂා කිරීමට ඔබට ඉඩ සලසයි. (සාරාංශ යනු තීක්ෂ්ණ බුද්ධිය නැති වූ තැනයි.) ඇමතුම් ප්‍රස්ථාර ඔබට එකම තොරතුරු ලබා නොදේ

  1. ඔවුන් උපදෙස් මට්ටමින් සාරාංශ කරන්නේ නැත, සහ
  2. පුනරාවර්තනය ඉදිරියේ ඔවුන් ව්‍යාකූල සාරාංශ ලබා දේ.

ඇත්ත වශයෙන්ම එය ඕනෑම වැඩසටහනක වැඩ කරන විට එය සෙල්ලම් වැඩසටහන් මත පමණක් ක්‍රියාත්මක වන බව ඔවුන් පවසනු ඇති අතර, එය විශාල වැඩසටහන් සඳහා වඩා හොඳින් ක්‍රියා කරන බව පෙනේ, මන්ද ඔවුන්ට සොයා ගැනීමට වැඩි ගැටළු ඇති බැවිනි. ඔවුන් පවසන්නේ එය සමහර විට ගැටළු නොවන දේවල් සොයා ගන්නා බවයි, නමුත් එය සත්‍ය වන්නේ ඔබ යමක් වරක් දුටුවහොත් පමණි . එක් නියැදියකට වඩා වැඩි ගණනක ගැටලුවක් ඔබ දුටුවහොත් එය සැබෑ ය.

PS ජාවා හි ඇති ආකාරයට වරකට නූල් තටාකයේ ඇමතුම්-තොග සාම්පල එක්රැස් කිරීමට ක්‍රමයක් තිබේ නම් මෙය බහු-නූල් වැඩසටහන් වලද කළ හැකිය.

පීපීඑස් දළ වශයෙන් සාමාන්‍යයක් ලෙස, ඔබේ මෘදුකාංගය තුළ ඔබ සතුව ඇති වියුක්ත ස්ථර වැඩි වන විට, කාර්ය සාධන ගැටළු වලට (සහ වේගවත් වීමේ අවස්ථාව) හේතුව එය බව ඔබ සොයා ගැනීමට වැඩි ඉඩක් ඇත.

එකතු කරන ලදි : එය පැහැදිලිව පෙනෙන්නට නොතිබිය හැකි නමුත්, පුනරාවර්තනය ඉදිරියේ තොග නියැදි කිරීමේ තාක්ෂණය සමානව ක්‍රියා කරයි. හේතුව, නියැදියක් තුළ කොපමණ වාර ගණනක් සිදුවිය හැකිද යන්න නොසලකා, උපදෙස් ඉවත් කිරීමෙන් ඉතිරි වන කාලය දළ වශයෙන් එය අඩංගු සාම්පල වලින් ගණනය කෙරේ.

මට බොහෝ විට අසන්නට ලැබෙන තවත් විරෝධයක් නම්: " එය අහඹු තැනක් නවත්වනු ඇත, එය සැබෑ ගැටළුව මග හැරෙනු ඇත ". මෙය පැමිණෙන්නේ සැබෑ ගැටළුව කුමක්ද යන්න පිළිබඳ පූර්ව සංකල්පයක් තිබීමෙනි. කාර්ය සාධන ගැටළු වල ප්‍රධාන ගුණාංගයක් වන්නේ ඒවා අපේක්ෂාවන් නොසලකා හැරීමයි. නියැදීම ඔබට යමක් ගැටළුවක් බව පවසන අතර ඔබේ පළමු ප්‍රතිචාරය අවිශ්වාසයයි. එය ස්වාභාවිකය, නමුත් එය සත්‍යයක් බව ගැටලුවක් සොයා ගන්නේ නම් ඔබට සහතික විය හැකිය, සහ අනෙක් අතට.

එකතු කරන ලදි : එය ක්‍රියාත්මක වන ආකාරය පිළිබඳ බේසියානු පැහැදිලි කිරීමක් කිරීමට මට ඉඩ දෙන්න. Iඇමතුමෙහි යම් යම් උපදෙස් (ඇමතුමක් හෝ වෙනත් ආකාරයකින්) තිබේ යැයි සිතමු f, එම කාලයෙන් යම් ප්‍රමාණයක් (ඒ සඳහා එතරම් මුදලක් වැය වේ). සරල බව සඳහා, අපි කුමක් දැයි නොදනිමු යැයි සිතමු f, නමුත් එය 0.1, 0.2, 0.3, ... 0.9, 1.0, සහ මෙම එක් එක් හැකියාවන් සඳහා පූර්ව සම්භාවිතාව 0.1 වේ යැයි සිතමු, එබැවින් මෙම සියලු වියදම් සමානව විය හැකිය a-priri.

එවිට අපි කොටස් සාම්පල 2 ක් පමණක් ගනිමු යැයි සිතමු . Iසාම්පල දෙකෙහිම උපදෙස් , නම් කරන ලද නිරීක්ෂණ අපට පෙනේ o=2/2. මේ අනුව, සංඛ්‍යාතය fපිළිබඳ නව ඇස්තමේන්තු මෙය අපට ලබා දෙයි I:

Prior                                    
P(f=x) x  P(o=2/2|f=x) P(o=2/2&&f=x)  P(o=2/2&&f >= x)  P(f >= x | o=2/2)

0.1    1     1             0.1          0.1            0.25974026
0.1    0.9   0.81          0.081        0.181          0.47012987
0.1    0.8   0.64          0.064        0.245          0.636363636
0.1    0.7   0.49          0.049        0.294          0.763636364
0.1    0.6   0.36          0.036        0.33           0.857142857
0.1    0.5   0.25          0.025        0.355          0.922077922
0.1    0.4   0.16          0.016        0.371          0.963636364
0.1    0.3   0.09          0.009        0.38           0.987012987
0.1    0.2   0.04          0.004        0.384          0.997402597
0.1    0.1   0.01          0.001        0.385          1

                  P(o=2/2) 0.385                

අවසාන තීරුවේ සඳහන් වන්නේ, උදාහරණයක් ලෙස f> = 0.5 92% ක් වන සම්භාවිතාව පූර්ව උපකල්පිත 60% ට වඩා ඉහළ අගයක් ගන්නා බවයි.

පෙර උපකල්පන වෙනස් යැයි සිතමු. අපි උපකල්පනය කරමු P(f=0.1).991 (ආසන්න වශයෙන් නිශ්චිත), සහ අනෙක් සියලු හැකියාවන් පාහේ කළ නොහැකි ය (0.001). වෙනත් වචන වලින් කිවහොත්, අපගේ පූර්ව නිශ්චිතභාවය Iඑය ලාභයි. එවිට අපට ලැබෙන්නේ:

Prior                                    
P(f=x) x  P(o=2/2|f=x) P(o=2/2&& f=x)  P(o=2/2&&f >= x)  P(f >= x | o=2/2)

0.001  1    1              0.001        0.001          0.072727273
0.001  0.9  0.81           0.00081      0.00181        0.131636364
0.001  0.8  0.64           0.00064      0.00245        0.178181818
0.001  0.7  0.49           0.00049      0.00294        0.213818182
0.001  0.6  0.36           0.00036      0.0033         0.24
0.001  0.5  0.25           0.00025      0.00355        0.258181818
0.001  0.4  0.16           0.00016      0.00371        0.269818182
0.001  0.3  0.09           0.00009      0.0038         0.276363636
0.001  0.2  0.04           0.00004      0.00384        0.279272727
0.991  0.1  0.01           0.00991      0.01375        1

                  P(o=2/2) 0.01375                

දැන් එය P(f >= 0.5)26% ක් යැයි කියනු ලැබේ, එය පූර්ව උපකල්පනයට වඩා 0.6% කි. එබැවින් විය හැකි පිරිවැය පිළිබඳ අපගේ ඇස්තමේන්තුව යාවත්කාලීන කිරීමට බේස් අපට ඉඩ දෙයි I. දත්ත ප්‍රමාණය කුඩා නම්, එය පිරිවැය කුමක්දැයි අපට නිවැරදිව නොකියයි, එය නිවැරදි කිරීමට තරම් විශාල බව පමණි.

එය දෙස බැලීමට තවත් ක්‍රමයක් නම් අනුප්‍රාප්තියේ රීතිය ලෙස හැඳින්වේ . ඔබ කාසියක් 2 වතාවක් පෙරළා, එය දෙවරක් හිස ඔසවයි නම්, එමඟින් කාසියේ බර කිරා බැලීම ගැන ඔබට කියන්නේ කුමක්ද? පිළිතුරු දීමට ගෞරවනීය ක්‍රමය නම් එය සාමාන්‍ය අගයක් සහිත බීටා බෙදාහැරීමක් යැයි කීමයි (number of hits + 1) / (number of tries + 2) = (2+1)/(2+2) = 75%.

(ප්‍රධාන දෙය නම් අප Iඑක් වරකට වඩා දකින බවයි. අප එය එක් වරක් පමණක් දුටුවහොත්, එය f> 0 හැර අපට බොහෝ දේ නොකියයි. )

එබැවින්, සාම්පල ඉතා සුළු සංඛ්‍යාවක් පවා එය දකින උපදෙස්වල පිරිවැය ගැන අපට බොහෝ දේ පැවසිය හැකිය. (එය ඔවුන් සංඛ්යාතය, සාමාන්යය මත, ඔවුන්ගේ වියදමින් සමානුපාතික දකිනු ඇත. නම් nසාම්පල ගන්නා අතර, fවියදම වන අතර, පසුව Iමත දිස් වනු ඇත nf+/-sqrt(nf(1-f))සාම්පල. නිදර්ශන, n=10, f=0.3, එනම් 3+/-1.4සාම්පල.)


එකතු කරන ලදි : මිනුම් සහ අහඹු තොග නියැදි අතර වෙනස සඳහා අවබෝධාත්මක හැඟීමක් ලබා දීම සඳහා:
බිත්ති-ඔරලෝසු වේලාවේදී පවා, තොගය සාම්පල ලබා දෙන පැතිකඩයන් ඇත, නමුත් එළියට එන්නේ මිනුම් (හෝ උණුසුම් මාවත හෝ උණුසුම් ස්ථානය, එයින් "බාධකයක්" පහසුවෙන් සැඟවිය හැක). ඔවුන් ඔබට නොපෙන්වන දේ (ඔවුන්ට පහසුවෙන් කළ හැකි) සැබෑ සාම්පල ඔවුන්ම වේ. ඔබේ ඉලක්කය වන්නේ බාධකය සොයා ගැනීම නම්, ඔබ දැකීමට අවශ්‍ය සංඛ්‍යාව සාමාන්‍යයෙන් 2 ක් ගතවන කාලයෙන් බෙදනු ලැබේ. එබැවින් එය 30% ක කාලයක් ගත වුවහොත්, සාමාන්‍යයෙන් 2 / .3 = 6.7 සාම්පල එය පෙන්වනු ඇති අතර සාම්පල 20 ක් පෙන්වීමේ අවස්ථාව 99.2% කි.

මිනුම් පරීක්ෂා කිරීම සහ තොග සාම්පල පරීක්ෂා කිරීම අතර ඇති වෙනස පිළිබඳ නිර්‍මාණ නිදර්ශනයක් මෙන්න. බාධකය මේ වගේ එක් විශාල පිපිරීමක් විය හැකිය, නැතහොත් කුඩා ඒවා ගණනාවක් වුවද එයින් කිසිදු වෙනසක් සිදු නොවේ.

රූප විස්තරය මෙහි ඇතුළත් කරන්න

මිනුම් තිරස්; නිශ්චිත ක්‍රියාකාරකම් සඳහා ගතවන කාලයෙන් කොපමණ ප්‍රමාණයක් එය ඔබට කියයි. නියැදීම සිරස් අතට ඇත. එම අවස්ථාවේදී සමස්ත වැඩසටහනම කරන්නේ කුමක්ද යන්න වළක්වා ගැනීමට ක්‍රමයක් තිබේ නම්, ඔබ එය දෙවන සාම්පලයකින් දුටුවහොත් , ඔබට බාධකය හමු විය. වෙනස ඇති කරන්නේ එයයි - කාලය ගත කිරීම සඳහා සම්පූර්ණ හේතුව දැකීම මිස කොපමණ ප්‍රමාණයක් නොවේ.


293
මෙය මූලික වශයෙන් දුප්පත් මිනිසෙකුගේ නියැදි පැතිකඩකි, එය විශිෂ්ටයි, නමුත් ඔබ ඉතා කුඩා නියැදි ප්‍රමාණයේ අවදානම ක්‍රියාත්මක කරන අතර එමඟින් ඔබට සම්පූර්ණයෙන්ම ව්‍යාජ ප්‍රති .ල ලැබෙනු ඇත.
ක්‍රෑෂ්වර්ක්ස්

102
Ra ක්‍රෑෂ්: මම "දුප්පත් මිනිසා" කොටස ගැන විවාද නොකරමි :-) සංඛ්‍යාන මිනුම් නිරවද්‍යතාවයට බොහෝ සාම්පල අවශ්‍ය බව සත්‍යයකි, නමුත් පරස්පර අරමුණු දෙකක් ඇත - මිනුම් සහ ගැටළු පිහිටීම. මම අවධානය යොමු කරන්නේ දෙවැන්න වෙතයි, ඒ සඳහා ඔබට අවශ්‍ය වන්නේ ස්ථානය පිළිබඳ නිරවද්‍යතාවය මිස මිනුම්වල නිරවද්‍යතාවය නොවේ. උදාහරණයක් ලෙස, මැද-තොගයක්, තනි ශ්‍රිත ඇමතුමක් A () තිබිය හැකිය; එය 50% ක කාලයක් සඳහා දායක වේ, නමුත් එය තවත් විශාල ශ්‍රිතයක් විය හැකිය, ඒ සමඟ තවත් බොහෝ ඇමතුම් A () වෙත මිල අධික නොවේ. ක්‍රියාකාරී වේලාවන්හි නිරවද්‍ය සාරාංශය හෝඩුවාවක් විය හැකි නමුත් අනෙක් සෑම සිරස් නියැදියක්ම ගැටලුව හඳුනා ගනී.
මයික් ඩන්ලවේ

43
... ඇමතුම් ගණනය කිරීම් සහ / හෝ සාමාන්‍ය වේලාවන් සමඟ විවරණය කර ඇති ඇමතුම් ප්‍රස්ථාරයක් ප්‍රමාණවත් යැයි ලෝකය සිතන බව පෙනේ. එය එසේ නොවේ ය. කනගාටුදායක කොටස නම්, ඇමතුම් තොගය සාම්පල ලබා ගන්නා අයට, වඩාත්ම ප්‍රයෝජනවත් තොරතුරු ඔවුන් ඉදිරිපිටම තිබීමයි, නමුත් ඔවුන් එය "සංඛ්‍යාලේඛන" වල උවමනාව මත ඉවත දමයි.
මයික් ඩන්ලවේ

30
මම ඔබේ තාක්‍ෂණයට එකඟ නොවීමට අදහස් කරමි. පැහැදිලිවම මම දැඩි ලෙස රඳා පවතින්නේ තොග ඇවිදීමේ නියැදි පැතිකඩ මත ය. මම දැන් පෙන්වා දෙන්නේ එය ස්වයංක්‍රීය ආකාරයකින් කරන සමහර මෙවලම් ඇති අතර, එය 25% සිට 15% දක්වා ශ්‍රිතයක් ලබා ගැනීමේ අවස්ථාව පසු කර ඇති විට එය වැදගත් වන අතර එය 1.2% සිට 15% දක්වා තට්ටු කිරීමට අවශ්‍ය වේ. 0.6%.
ක්‍රෑෂ්වර්ක්ස්

13
-1: පිළිවෙලට අදහසක්, නමුත් ඔබ මධ්‍යස්ථ කාර්ය සාධනයක් සහිත පරිසරයක පවා වැඩ කිරීමට මුදල් ගෙවන්නේ නම් මෙය සෑම කෙනෙකුගේම කාලය නාස්තියකි. සැබෑ පැතිකඩක් භාවිතා කරන්න එවිට අපට ඔබ පසුපස පැමිණ සැබෑ ගැටලු විසඳීමට අවශ්‍ය නොවේ.
සෑම් හාවල්

587

ඔබට පහත විකල්ප සමඟ Valgrind භාවිතා කළ හැකිය

valgrind --tool=callgrind ./(Your binary)

එය නමින් ගොනුවක් ජනනය කරනු ඇත callgrind.out.x. kcachegrindමෙම ගොනුව කියවීමට ඔබට මෙවලම භාවිතා කළ හැකිය . කුමන රේඛාවලට කොපමණ මුදලක් වැය වේද වැනි ප්‍රති results ල සහිත දේවල් පිළිබඳ චිත්‍රමය විශ්ලේෂණයක් එය ඔබට ලබා දෙනු ඇත.


52
valgrind නියමයි, නමුත් එය ඔබගේ වැඩසටහන මන්දගාමී වන බවට අනතුරු
අඟවන්න

30
ප්‍රතිදානය දෘශ්‍යමාන කිරීම සඳහා පුදුමාකාර විකල්ප ක්‍රමයක් සඳහා Gprof2Dot ද බලන්න . ./gprof2dot.py -f callgrind callgrind.out.x | dot -Tsvg -o output.svg
සෙබස්තියන්

2
@neves ඔව් “gstreamer” සහ “opencv” යෙදුම් තත්‍ය කාලීනව පැතිකඩ කිරීම සඳහා වේගය අනුව Valgrind එතරම් ප්‍රයෝජනවත් නොවේ.
උද්යෝගිමත්

1
stackoverflow.com/questions/375913/… යනු වේගය නිකුත් කිරීම සඳහා වන අර්ධ ද්‍රාවණයකි.
ටෙනු සැමුවෙල්

3
E සෙබස්තියන්: gprof2dotදැන් මෙහි ඇත: github.com/jrfonseca/gprof2dot
ජෝන් ස්වින්ක්

352

මම හිතන්නේ ඔබ GCC භාවිතා කරනවා. සම්මත විසඳුම වනුයේ gprof සමඟ පැතිකඩ කිරීමයි .

-pgපැතිකඩ කිරීමට පෙර සම්පාදනයට එකතු කිරීමට වග බලා ගන්න :

cc -o myprog myprog.c utils.c -g -pg

මම තවම එය උත්සාහ කර නැති නමුත් ගූගල්-පර්ෆූල් ගැන හොඳ දේ අසා ඇත්තෙමි . එය අනිවාර්යයෙන්ම උත්සාහ කිරීම වටී.

අදාළ ප්‍රශ්නය මෙතැනින් .

gprofඔබ වෙනුවෙන් කාර්යය නොකරන්නේ නම් තවත් බස පද කිහිපයක් : වැල්ග්‍රින්ඩ් , ඉන්ටෙල් වීටියුන් , සන් ඩීට්‍රේස් .


4
Gprof යනු වර්තමාන ප්‍රමිතිය බව මම එකඟ වෙමි. සටහනක් පමණක් වුවද, Valgrind භාවිතා කරනුයේ ඔබේ වැඩසටහන් වල මතක කාන්දුවීම් සහ වෙනත් මතකය හා සම්බන්ධ පැතිකඩයන් මිස වේග ප්‍රශස්තිකරණය සඳහා නොවේ.
බිල් ද කටුස්සා

69
බිල්, වැග්ලින්ඩ් කට්ටලයෙන් ඔබට කෝල්ග්‍රයින්ඩ් සහ මැසිෆ් සොයාගත හැකිය. දෙකම පැතිකඩ යෙදුම් සඳහා බෙහෙවින් ප්‍රයෝජනවත් වේ
dario minonne

8
@ බිල්-ද-කටුස්සා: gprof පිළිබඳ සමහර අදහස් : stackoverflow.com/questions/1777556/alternatives-to-gprof/…
මයික්

7
gprof -pg යනු කෝල්ස්ටැක් පැතිකඩ පිළිබඳ දළ විශ්ලේෂණයක් පමණි. කුමන ශ්‍රිතයන් කැඳවන්නේ වෙනත් කාර්යයන්දැයි සොයා බැලීමට එය mcount ඇමතුම් ඇතුළත් කරයි. එය සම්මත වේලාව පදනම් කරගත් නියැදියක් භාවිතා කරයි. එය පසුව foo () ශ්‍රිතයක නියැදි වේලාවන් නැවත foo () අමතන්නන්ට, ඇමතුම් සංඛ්‍යාවට සමානුපාතික වේ. එබැවින් එය විවිධ වියදම් ඇමතුම් අතර වෙනස හඳුනා නොගනී.
ක්‍රේසි ග්ලේ

2
ක්ලැන්ග් / ක්ලැන්ග් ++ සමඟ, යමෙකුට gperftools හි CPU පැතිකඩ භාවිතා කිරීම ගැන සලකා බැලිය හැකිය . කේවියට්: මා විසින්ම එසේ කර නැත.
einpoklum

259

නව කර්නල් (උදා: නවතම උබුන්ටු කර්නල්) නව ' පරිපූර්ණ ' මෙවලම් ( apt-get install linux-tools) AKA perf_events සමඟ පැමිණේ .

මේවා සම්භාව්‍ය නියැදි පැතිකඩ ( මෑන්- පේජ් ) මෙන්ම නියම කාලසටහන සමඟ පැමිණේ !

වැදගත්ම දෙය නම්, මෙම මෙවලම් පද්ධති පැතිකඩ විය හැකි අතර එය පැතිකඩ සැකසීම පමණක් නොවේ - ඒවාට නූල්, ක්‍රියාවලි සහ කර්නලය අතර අන්තර්ක්‍රියා පෙන්විය හැකි අතර ක්‍රියාවලි අතර උපලේඛනගත කිරීම සහ I / O පරායත්තතාවයන් ඔබට තේරුම් ගත හැකිය.

Alt පෙළ


13
නියම මෙවලමක්! "Main-> func1-> fun2" ශෛලියෙන් ආරම්භ වන සාමාන්‍ය "සමනල" දර්ශනයක් ලබා ගැනීමට මට කෙසේ හෝ තිබේද? මට එය හදුනාගත නොහැකි බව පෙනේ ... perf reportමට ඇමතුම් දෙමාපියන් සමඟ ක්‍රියාකාරී නම් ලබා දෙන බවක් පෙනේ ... (එබැවින් එය
ප්‍රතිලෝම

1
කැමැත්ත, නූල් ක්‍රියාකාරිත්වයේ කාල සටහන පෙන්විය හැකිය; CPU අංක තොරතුරු සමඟ? සෑම CPU එකකම ක්‍රියාත්මක වන්නේ කවදාද සහ කුමන නූල් දැයි බැලීමට මට අවශ්‍යය.
osgx

3
@ kizzx2 - ඔබ භාවිතා කළ හැකිය gprof2dotසහ perf script. ඉතා හොඳ මෙවලමක්!
dashesy

3
4.13 වැනි නවතම කර්නල් වල පවා පැතිකඩ සඳහා ඊබීපීඑෆ් ඇත. Brendangregg.com/blog/2015-05-15/ebpf-one-small-step.html සහ brendangregg.com/ebpf.html
ස්ටර්න්

1
තවත් ලස්සන හඳුන්වා perfපවතින archive.li/9r927#selection-767.126-767.271 (මෙම SO දෙවිවරුන් SO දැනුම් පදනම සිට එම පිටුව ඉවත් කිරීමට තීරණය කර ඇයි .... මා ඉක්මවා මිල)
ragerdl

77

මගේ පැතිකඩ මෙවලම් කට්ටලය සඳහා පදනමක් ලෙස මම Valgrind සහ Callgrind භාවිතා කරමි. දැනගත යුතු වැදගත් දෙය නම් වැල්ග්‍රින්ඩ් මූලික වශයෙන් අථත්‍ය යන්ත්‍රයකි:

(විකිපීඩියා) වැල්ග්‍රින්ඩ් යනු සාර්‍ථයෙන්ම ගතික ප්‍රතිනිර්මාණය ඇතුළුව යන්තම් (JIT) සම්පාදන ක්‍රම භාවිතා කරන අථත්‍ය යන්ත්‍රයකි. මුල් වැඩසටහනෙන් කිසිවක් කෙලින්ම ධාරක සකසනය මත ක්‍රියාත්මක නොවේ. ඒ වෙනුවට, වැල්ග්‍රින්ඩ් විසින් වැඩසටහන තාවකාලිකව සරල ආකාරයකට අතරමැදි නිරූපණය (IR) ලෙස පරිවර්තනය කරයි, එය ප්‍රොසෙසර්-උදාසීන, SSA මත පදනම් වූ ආකෘතියකි. පරිවර්තනයෙන් පසු, මෙවලමක් (පහත බලන්න) IR මත කැමති ඕනෑම පරිවර්තනයක් කිරීමට නිදහස ඇත, Valgrind විසින් IR නැවත යන්ත්‍ර කේතයට පරිවර්ථනය කර ධාරක සකසනය ක්‍රියාත්මක කිරීමට පෙර.

Callgrind යනු ඒ මත පදනම් වූ පැතිකඩකි. ප්‍රධාන වාසිය නම් විශ්වාසදායක ප්‍රති .ල ලබා ගැනීම සඳහා ඔබේ ඉල්ලීම පැය ගණනක් ධාවනය කිරීමට අවශ්‍ය නොවන බවයි. පාෂාණමය, න, විශ්වාසදායක ප්‍රති results ල ලබා ගැනීම සඳහා තත්පරයක ධාවන කාලයක් පවා ප්‍රමාණවත් වේ, මන්ද කැල්ග්‍රින්ඩ් පරික්‍ෂා නොකරන පැතිකඩකි .

වැල්ග්‍රින්ඩ් මත ගොඩනඟන තවත් මෙවලමක් වන්නේ මැසිෆ් ය. පැතිකඩ ගොඩවල් මතක භාවිතය සඳහා මම එය භාවිතා කරමි. එය විශිෂ්ටයි. එය කරන්නේ එය ඔබට මතක භාවිතය පිළිබඳ ඡායාරූප ලබා දීමයි - සවිස්තරාත්මක තොරතුරු WHAT මතකයේ ප්‍රතිශතය කුමක්ද, සහ WHO එය එහි තබා ඇත. එවැනි තොරතුරු යෙදුම් ක්‍රියාත්මක වන වේලාවේ විවිධ අවස්ථා වලදී ලබා ගත හැකිය.


72

valgrind --tool=callgrindසමහර විකල්ප නොමැතිව ධාවනය සඳහා පිළිතුර තරමක් සම්පූර්ණ නොවේ. Valgrind යටතේ මිනිත්තු 10 ක මන්දගාමී ආරම්භක වේලාවක් පැතිකඩ කිරීමට අපට සාමාන්‍යයෙන් අවශ්‍ය නොවන අතර එය යම් කාර්යයක් කරන විට අපගේ වැඩසටහන පැතිකඩ කිරීමට අවශ්‍ය වේ.

ඉතින් මම නිර්දේශ කරන්නේ මෙයයි. පළමුව වැඩසටහන ක්‍රියාත්මක කරන්න:

valgrind --tool=callgrind --dump-instr=yes -v --instr-atstart=no ./binary > tmp

දැන් එය ක්‍රියාත්මක වන විට සහ පැතිකඩ ආරම්භ කිරීමට අවශ්‍ය විට අපි වෙනත් කවුළුවක ධාවනය කළ යුතුය:

callgrind_control -i on

මෙය පැතිකඩ සක්‍රිය කරයි. එය නිවා දැමීමට සහ අප භාවිතා කළ හැකි සම්පූර්ණ කාර්යය නැවැත්වීමට:

callgrind_control -k

වත්මන් නාමාවලියෙහි දැන් callgrind.out. * නමින් සමහර ගොනු තිබේ. පැතිකඩ ප්‍රති results ල බැලීමට භාවිතා කරන්න:

kcachegrind callgrind.out.*

"ස්වයං" තීරු ශීර්ෂකය මත ක්ලික් කිරීමට මම ඊළඟ කවුළුවේ නිර්දේශ කරමි, එසේ නොමැතිනම් "ප්‍රධාන ()" බොහෝ කාලයක් ගතවන කාර්යයක් බව පෙන්නුම් කරයි. “ස්වයං” මඟින් පෙන්වන්නේ එක් එක් ශ්‍රිතයට කොපමණ කාලයක් ගතවේද යන්න මිස යැපෙන්නන් සමඟ නොවේ.


10
දැන් කිසියම් හේතුවක් නිසා callgrind.out. * ගොනු සෑම විටම හිස් විය. Callgrind_control -d ක්‍රියාත්මක කිරීම දත්ත තැටියට බල කිරීම සඳහා ප්‍රයෝජනවත් විය.
ටෙනූ සැමුවෙල්

4
බැහැ. මගේ සුපුරුදු සන්දර්භය සමස්ත MySQL හෝ PHP වැනි දෙයක් හෝ ඒ හා සමාන විශාල දෙයක්. බොහෝ විට මට මුලින් වෙන් කිරීමට අවශ්‍ය දේ පවා නොදනී.
ටෙනු සැමුවෙල්

3
නැතහොත් මගේ වැඩසටහන ඇත්ත වශයෙන්ම දත්ත පොකුරක් LRU හැඹිලියකට පටවනු ලබන අතර, එය පැතිකඩ නොකිරීමට මට අවශ්‍යය. එබැවින් මම ආරම්භයේ දී හැඹිලියේ උප කුලකයක් බලහත්කාරයෙන් පටවා, එම දත්ත පමණක් භාවිතා කරමින් කේතය පැතිකඩ කරමි (මගේ හැඹිලිය තුළ මතක භාවිතය කළමනාකරණය කිරීමට OS + CPU ට ඉඩ දෙන්න). එය ක්‍රියාත්මක වේ, නමුත් එම හැඹිලිය පැටවීම මන්දගාමී වන අතර මම වෙනත් සන්දර්භයක් තුළ පැතිකඩක් කිරීමට උත්සාහ කරන කේතය හරහා CPU තීව්‍ර වේ, එබැවින් කෝල්ග්‍රයින්ඩ් දූෂිත ප්‍රති .ල ලබා දෙයි.
කේත පිළිකුල්කරු

3
CALLGRIND_TOGGLE_COLLECTක්‍රමලේඛිකව එකතු කිරීම සක්‍රීය / අක්‍රීය කිරීමට ද ඇත; stackoverflow.com/a/13700817/288875
ඇන්ඩ්‍රේ හොල්ස්නර්

1
@ TõnuSamuel, මටත් callgrind.out. * හිස් විය. මගේ නඩුවේදී, වැඩසටහන පැතිකඩ කරමින් සිටියදී බිඳ වැටෙමින් තිබුණි. බිඳවැටීමට හේතුව විසඳූ පසු, මට callgrind.out. * ගොනුවේ අන්තර්ගතය දැක ගත හැකිය.
ගවේෂක

61

මෙය නස්ගොබ්ගේ ජීප්‍රොෆ් පිළිතුරට ප්‍රතිචාරයකි .

මම පසුගිය දින කිහිපය තුළ Gprof භාවිතා කර ඇති අතර දැනටමත් සැලකිය යුතු සීමාවන් තුනක් සොයාගෙන ඇත, ඉන් එකක් වෙනත් තැනක (තවමත්) ලේඛනගත කර ඇති බවක් මා දැක නැත:

  1. ඔබ වැඩකරන ක්‍රමයක් භාවිතා නොකරන්නේ නම් එය බහු-නූල් කේත මත නිසි ලෙස ක්‍රියා නොකරයි

  2. ඇමතුම් ප්‍රස්ථාරය ක්‍රියාකාරී දර්ශකයන් විසින් ව්‍යාකූල වේ. උදාහරණය: මා සතුව ශ්‍රිතයක් ඇත multithread(), එමඟින් නිශ්චිත අරාවකට වඩා නිශ්චිත ශ්‍රිතයක් බහු-නූල් කිරීමට මට හැකි වේ (දෙකම තර්ක ලෙස සම්මත). කෙසේ වෙතත්, Gprof multithread()ළමයින් සඳහා ගත කරන කාලය ගණනය කිරීමේ අරමුණු සඳහා සියලු ඇමතුම් සමාන යැයි සලකයි . සමහර කාර්යයන් multithread()අනෙක් ඒවාට වඩා වැඩි කාලයක් ගතවන බැවින් මගේ ඇමතුම් ප්‍රස්තාර බොහෝ දුරට නිෂ් .ල ය. (නූල් දැමීම මෙහි ගැටලුව දැයි කල්පනා කරන අයට: නැත, multithread()විකල්පයක් ලෙස කළ හැකි අතර, මේ අවස්ථාවේ දී, සෑම දෙයක්ම අනුපිළිවෙලින් ඇමතුම් නූල් මත පමණක් ධාවනය කරන්න).

  3. එය මෙහි සඳහන් වන්නේ "... ඇමතුම් ගණන ලබාගෙන ඇත්තේ නියැදීමෙන් නොව ගණන් කිරීමෙන් ය. ඒවා සම්පූර්ණයෙන්ම නිවැරදි ය ...". මගේ ඇමතුම් ප්‍රස්ථාරය මට 5345859132 + 784984078 ලබා දෙන බව මට පෙනී ගොස් ඇත. මගේ අංකනය කරන ලද ශ්‍රිතයට ඇමතුම් සංඛ්‍යාලේඛන ලෙස, පළමු අංකය direct ජු ඇමතුම් විය යුතු අතර දෙවන පුනරාවර්තන ඇමතුම් (ඒවා සියල්ලම තමා විසින්ම වේ). මෙයින් ඇඟවෙන්නේ මට දෝෂයක් ඇති බැවින්, මම දිගු (බිට් 64) කවුන්ටර කේතයට ඇතුළත් කර නැවත එම ධාවනයම කළෙමි. මගේ ගණන්: 5345859132 සෘජු, සහ 78094395406 ස්වයං පුනරාවර්තන ඇමතුම්. එහි ඉලක්කම් විශාල ප්‍රමාණයක් ඇත, එබැවින් මම මනින පුනරාවර්තන ඇමතුම් 78bn වන අතර Gprof වෙතින් මීටර් 784 ට වඩා වෙනස් වේ: 100 ක සාධකයකි. ලකුණු දෙකම තනි නූල් සහ භාවිතයට නොගත් කේතයක් විය, එකක් සම්පාදනය කරන ලද -gඅතර අනෙක -pg.

මෙය GNU Gprof (ඩේබියන් සඳහා GNU Binutils) 2.18.0.20080103 බිට් 64 ඩෙබියන් ලෙනී යටතේ ධාවනය වන අතර එය ඕනෑම කෙනෙකුට උපකාර කරයි.


1
ඔව්, එය නියැදීම් කරයි, නමුත් ඇමතුම් ගණන සඳහා නොවේ. ඔබගේ සබැඳිය අනුගමනය කිරීමෙන් අවසානයේ මගේ ලිපියට මා සම්බන්ධ කළ අත්පොතෙහි නව සංස්කරණයක් වෙත යොමු විය, නව URL: sourceware.org/binutils/docs/gprof/… මෙය මගේ පිළිතුරේ (iii) කොටසෙහි උපුටා දැක්වීම පුනරාවර්තනය කරයි, “බහු-නූල් සහිත යෙදුම් සමඟ හෝ බහු නූල් සහිත පුස්තකාල සමඟ සම්බන්ධ වන තනි නූල් සහිත යෙදුම්වල, ගණනය කිරීම් තීරණය වන්නේ ගණන් කිරීමේ කාර්යය නූල්-ආරක්ෂිත නම් පමණි. (සටහන: glibc හි mcount ගණන් කිරීමේ කාර්යය නූල් නොවන බවට පරිස්සම් වන්න -සෙෆ්).
Rob_before_edits

1
(Iii) හි මගේ ප්‍රති result ලය මෙය පැහැදිලි කරන්නේ නම් එය මට පැහැදිලි නැත. මගේ කේතය -lpthread -lm හා සම්බන්ධ කර ඇති අතර එය "pthread_t * thr" සහ "pthread_mutex_t nextLock = PTHREAD_MUTEX_INITIALIZER" ස්ථිතික විචල්‍යය තනි නූල් ධාවනය වන විට පවා ප්‍රකාශයට පත් කළේය. මම සාමාන්‍යයෙන් උපකල්පනය කරන්නේ “බහු නූල් සහිත පුස්තකාල සමඟ සම්බන්ධ වීම” යන්නෙන් අදහස් කරන්නේ ඇත්ත වශයෙන්ම එම පුස්තකාල භාවිතා කිරීමයි, මෙයට වඩා බොහෝ දුරට, නමුත් මම වැරදියි!
Rob_before_edits

25

Valgrind, callgrind සහ kcachegrind භාවිතා කරන්න:

valgrind --tool=callgrind ./(Your binary)

callgrind.out.x ජනනය කරයි. Kcachegrind භාවිතයෙන් එය කියවන්න.

Gprof භාවිතා කරන්න (add -pg එකතු කරන්න):

cc -o myprog myprog.c utils.c -g -pg 

(බහු නූල්, ක්‍රියාකාරී දර්ශක සඳහා එතරම් හොඳ නැත)

Google-perftools භාවිතා කරන්න:

කාල නියැදීම භාවිතා කරයි, I / O සහ CPU බාධක අනාවරණය වේ.

Intel VTune හොඳම (අධ්‍යාපන අරමුණු සඳහා නොමිලේ) වේ.

වෙනත් ඒවා: AMD කෝඩනලිස්ට් (AMD CodeXL සමඟ ප්‍රතිස්ථාපනය කර ඇති බැවින්), OProfile, 'perf' මෙවලම් (apt-get install linux-tools)


13

සී ++ පැතිකඩ ශිල්ප ක්‍රම සමීක්ෂණය

මෙම පිළිතුරේ දී, එම මෙවලම් ක්‍රියා කරන ආකාරය සංක්ෂිප්තව සංසන්දනය කිරීම සඳහා ඉතා සරල පරීක්ෂණ වැඩසටහන් කිහිපයක් විශ්ලේෂණය කිරීමට මම විවිධ මෙවලම් කිහිපයක් භාවිතා කරමි.

පහත දැක්වෙන පරීක්ෂණ වැඩසටහන ඉතා සරල වන අතර පහත සඳහන් දේ කරයි:

  • mainඇමතුම් fastසහ maybe_slow3 වතාවක්, එක් maybe_slowඇමතුමක් මන්දගාමී වේ

    මන්දගාමී ඇමතුම maybe_slow10x දිගු වන අතර, ළමා ක්‍රියාකාරිත්වයට ඇමතුම් සලකා බැලුවහොත් ධාවන වේලාවේ ආධිපත්‍යය දරයි common. ඉතා මැනවින්, පැතිකඩ මෙවලමට නිශ්චිත මන්දගාමී ඇමතුම වෙත අපව යොමු කිරීමට හැකි වනු ඇත.

  • දෙකම fastසහ maybe_slowඇමතුම common, එය වැඩසටහන ක්‍රියාත්මක කිරීමේ වැඩි කොටසක් සඳහා හේතු වේ

  • වැඩසටහන් අතුරුමුහුණත:

    ./main.out [n [seed]]

    වැඩසටහන O(n^2)සම්පුර්ණයෙන්ම ලූප කරයි. seedධාවන කාලයට බලපෑමක් නොකර විවිධ ප්‍රතිදානයන් ලබා ගැනීම පමණි.

main.c

#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>

uint64_t __attribute__ ((noinline)) common(uint64_t n, uint64_t seed) {
    for (uint64_t i = 0; i < n; ++i) {
        seed = (seed * seed) - (3 * seed) + 1;
    }
    return seed;
}

uint64_t __attribute__ ((noinline)) fast(uint64_t n, uint64_t seed) {
    uint64_t max = (n / 10) + 1;
    for (uint64_t i = 0; i < max; ++i) {
        seed = common(n, (seed * seed) - (3 * seed) + 1);
    }
    return seed;
}

uint64_t __attribute__ ((noinline)) maybe_slow(uint64_t n, uint64_t seed, int is_slow) {
    uint64_t max = n;
    if (is_slow) {
        max *= 10;
    }
    for (uint64_t i = 0; i < max; ++i) {
        seed = common(n, (seed * seed) - (3 * seed) + 1);
    }
    return seed;
}

int main(int argc, char **argv) {
    uint64_t n, seed;
    if (argc > 1) {
        n = strtoll(argv[1], NULL, 0);
    } else {
        n = 1;
    }
    if (argc > 2) {
        seed = strtoll(argv[2], NULL, 0);
    } else {
        seed = 0;
    }
    seed += maybe_slow(n, seed, 0);
    seed += fast(n, seed);
    seed += maybe_slow(n, seed, 1);
    seed += fast(n, seed);
    seed += maybe_slow(n, seed, 0);
    seed += fast(n, seed);
    printf("%" PRIX64 "\n", seed);
    return EXIT_SUCCESS;
}

gprof

gprof සඳහා මෘදුකාංගය උපකරණ සමඟ නැවත සකස් කිරීම අවශ්‍ය වන අතර, එම උපකරණ සමඟ නියැදි ප්‍රවේශයක් ද භාවිතා කරයි. එබැවින් එය නිරවද්‍යතාව අතර සමතුලිතතාවයක් ඇති කරයි (නියැදීම සැමවිටම සම්පූර්ණයෙන් නිවැරදි නොවන අතර කාර්යයන් මඟ හැරිය හැක) සහ ක්‍රියාත්මක කිරීමේ මන්දගාමී වීම (උපකරණ සහ නියැදීම සාපේක්ෂව වේගවත් ක්‍රමවේදයන් වන අතර එය ක්‍රියාත්මක කිරීම මන්දගාමී නොවේ).

gprof GCC / binutils තුළ ගොඩනගා ඇත, එබැවින් අප කළ යුතුව ඇත්තේ -pggprof සක්‍රීය කිරීමේ විකල්පය සමඟ සම්පාදනය කිරීමයි. තත්පර කිහිපයක ( 10000) සාධාරණ කාල සීමාවක් ධාවනය කරන ප්‍රමාණයේ CLI පරාමිතියකින් අපි සාමාන්‍යයෙන් වැඩසටහන ක්‍රියාත්මක කරන්නෙමු :

gcc -pg -ggdb3 -O3 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
time ./main.out 10000

අධ්‍යාපනික හේතූන් මත, අපි ප්‍රශස්තිකරණය සක්‍රීය නොකර ධාවනය කරන්නෙමු. ප්‍රායෝගිකව මෙය නිෂ් less ල බව සලකන්න, ඔබ සාමාන්‍යයෙන් සැලකිලිමත් වන්නේ ප්‍රශස්තිකරණය කළ වැඩසටහනේ ක්‍රියාකාරිත්වය ප්‍රශස්ත කිරීම ගැන පමණි:

gcc -pg -ggdb3 -O0 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
./main.out 10000

පළමුවෙන්ම, timeඅපට කියනුයේ ක්‍රියාත්මක කිරීමේ කාලය හා රහිතව -pgඑක හා සමාන බවයි, එය විශිෂ්ටයි: මන්දගාමී වීමක් නැත! කෙසේ වෙතත්, සංකීර්ණ මෘදුකාංගවල 2x - 3x මන්දගාමී වීමේ ගිණුම් මම දැක ඇත්තෙමි, උදා: මෙම ප්‍රවේශ පත්‍රයේ පෙන්වා ඇති පරිදි .

අප සම්පාදනය කළ නිසා -pg, වැඩසටහන ක්‍රියාත්මක gmon.outකිරීමෙන් පැතිකඩ දත්ත අඩංගු ගොනු ගොනුවක් නිපදවයි .

gprof2dotඉල්ලූ පරිදි අපට එම ගොනුව ප්‍රස්ථාරිකව නිරීක්ෂණය කළ හැකිය : gprof ප්‍රති results ලවල චිත්‍රමය නිරූපණයක් ලබා ගත හැකිද?

sudo apt install graphviz
python3 -m pip install --user gprof2dot
gprof main.out > main.gprof
gprof2dot < main.gprof | dot -Tsvg -o output.svg

මෙතන, gprofමෙවලමක් කියවන gmon.outහෝඩුවාවක් තොරතුරු, සහ මානව කියවිය හැකි වාර්තාව ජනනය main.gprofවන gprof2dotපසුව ප්රස්ථාරයක් උත්පාදනය කිරීමට කියවනවා.

Gprof2dot සඳහා ප්‍රභවය වන්නේ: https://github.com/jrfonseca/gprof2dot

-O0ධාවනය සඳහා අපි පහත සඳහන් දෑ නිරීක්ෂණය කරමු :

රූප විස්තරය මෙහි ඇතුළත් කරන්න

සහ -O3ධාවනය සඳහා:

රූප විස්තරය මෙහි ඇතුළත් කරන්න

මෙම -O0ප්රතිදානය එච්චරමයි ස්වයං පැහැදිලි වේ. නිදසුනක් ලෙස, maybe_slowඇමතුම් 3 සහ ඔවුන්ගේ ළමා ඇමතුම් මුළු ධාවන කාලයෙන් 97.56% ක් ගන්නා බව පෙන්නුම් කරයි , නමුත් maybe_slowළමයින් නොමැතිව ක්‍රියාත්මක කිරීම මුළු ක්‍රියාත්මක කිරීමේ වේලාවෙන් 0.00% ක් පමණ වේ, එනම් එම කාර්යයේ ගත කළ මුළු කාලයම පාහේ වැය කර ඇත ළමා ඇමතුම්.

ටෝඩෝ: ජීඩීබී හි මට එය දැකිය හැකි වුවද, නිමැවුමේ mainඅස්ථානගත වී ඇත්තේ ඇයි ? GProf නිමැවුමේ ක්‍රියාකාරිත්වය අස්ථානගත වී ඇත්තේ එයට හේතුව gprof ද එහි සම්පාදනය කරන ලද උපකරණවලට අමතරව නියැදි කිරීම වන අතර එය ඉතා වේගවත් වන අතර සාම්පල කිසිවක් නොලැබුණි.-O3bt-O3 main

මම PNG වෙනුවට SVG ප්‍රතිදානය තෝරා ගන්නේ SVG Ctrl + F සමඟ සෙවිය හැකි නිසා සහ ගොනු ප්‍රමාණය 10x පමණ කුඩා විය හැකි බැවිනි. එසේම, ජනනය කරන ලද රූපයේ පළල සහ උස සංකීර්ණ මෘදුකාංග සඳහා පික්සල් දස දහස් ගණනක් සමඟ නිහතමානී විය හැකි අතර, පීඑන්ජී සඳහා GNOME eog3.28.1 දෝෂ ඇති වන අතර, එස්වීජී ස්වයංක්‍රීයව මගේ බ්‍රව්සරයෙන් විවෘත වේ. gimp 2.8 හොඳින් ක්‍රියා කළද මෙයද බලන්න:

නමුත් එසේ වුවද, ඔබට අවශ්‍ය දේ සොයා ගැනීම සඳහා ඔබ රූපය බොහෝ දුරට ඇදගෙන යනු ඇත, උදා : මෙම ටිකට් පතෙන් ලබාගත් “සැබෑ” මෘදුකාංග උදාහරණයකින් මෙම රූපය බලන්න :

රූප විස්තරය මෙහි ඇතුළත් කරන්න

ඉතා කුඩා වර්ගීකරණය නොකළ ස්පැගටි රේඛා එකිනෙක හරහා ගමන් කිරීමෙන් ඔබට වඩාත් විවේචනාත්මක ඇමතුම් තොගය පහසුවෙන් සොයාගත හැකිද? dotමට විශ්වාසයි වඩා හොඳ විකල්ප තිබිය හැකිය , නමුත් මට දැන් එහි යාමට අවශ්‍ය නැත. අපට සැබවින්ම අවශ්‍ය වන්නේ ඒ සඳහා නිසි කැපවූ නරඹන්නෙකු පමණි, නමුත් මම තවම එකක් සොයාගෙන නැත:

කෙසේ වෙතත් ඔබට වර්ණ සිතියම භාවිතා කර එම ගැටළු ටිකක් අවම කර ගත හැකිය. නිදසුනක් ලෙස, පෙර දැවැන්ත රූපය මත, කොළ පාටින් රතු පැහැයෙන් පසුව පැමිණෙන බව දීප්තිමත් අඩු කිරීමක් කළ විට වම් පසින් තීරණාත්මක මාවත සොයා ගැනීමට මට හැකි විය.

විකල්පයක් ලෙස, අප විසින් gprofමීට පෙර සුරකින ලද බිල්ට් බිනූටිල්ස් මෙවලමෙහි පෙළ ප්‍රතිදානය ද නිරීක්ෂණය කළ හැකිය :

cat main.gprof

පෙරනිමියෙන්, මෙය ප්‍රතිදාන දත්තවල තේරුම පැහැදිලි කරන අතිශය වාචික ප්‍රතිදානයක් නිපදවයි. මට ඊට වඩා හොඳින් පැහැදිලි කළ නොහැකි බැවින්, මම එය ඔබටම කියවීමට ඉඩ දෙමි.

දත්ත ප්‍රතිදාන ආකෘතිය ඔබ තේරුම් ගත් පසු, නිබන්ධනය නොමැතිව දත්ත පමණක් පෙන්වීමට ඔබට වාචිකතාව අඩු කළ -bහැකිය:

gprof -b main.out

අපගේ උදාහරණයේ දී, ප්‍රතිදානයන් සඳහා -O0:

Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls   s/call   s/call  name    
100.35      3.67     3.67   123003     0.00     0.00  common
  0.00      3.67     0.00        3     0.00     0.03  fast
  0.00      3.67     0.00        3     0.00     1.19  maybe_slow

            Call graph


granularity: each sample hit covers 2 byte(s) for 0.27% of 3.67 seconds

index % time    self  children    called     name
                0.09    0.00    3003/123003      fast [4]
                3.58    0.00  120000/123003      maybe_slow [3]
[1]    100.0    3.67    0.00  123003         common [1]
-----------------------------------------------
                                                 <spontaneous>
[2]    100.0    0.00    3.67                 main [2]
                0.00    3.58       3/3           maybe_slow [3]
                0.00    0.09       3/3           fast [4]
-----------------------------------------------
                0.00    3.58       3/3           main [2]
[3]     97.6    0.00    3.58       3         maybe_slow [3]
                3.58    0.00  120000/123003      common [1]
-----------------------------------------------
                0.00    0.09       3/3           main [2]
[4]      2.4    0.00    0.09       3         fast [4]
                0.09    0.00    3003/123003      common [1]
-----------------------------------------------

Index by function name

   [1] common                  [4] fast                    [3] maybe_slow

සහ සඳහා -O3:

Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  us/call  us/call  name    
100.52      1.84     1.84   123003    14.96    14.96  common

            Call graph


granularity: each sample hit covers 2 byte(s) for 0.54% of 1.84 seconds

index % time    self  children    called     name
                0.04    0.00    3003/123003      fast [3]
                1.79    0.00  120000/123003      maybe_slow [2]
[1]    100.0    1.84    0.00  123003         common [1]
-----------------------------------------------
                                                 <spontaneous>
[2]     97.6    0.00    1.79                 maybe_slow [2]
                1.79    0.00  120000/123003      common [1]
-----------------------------------------------
                                                 <spontaneous>
[3]      2.4    0.00    0.04                 fast [3]
                0.04    0.00    3003/123003      common [1]
-----------------------------------------------

Index by function name

   [1] common

එක් එක් කොටස සඳහා ඉතා ඉක්මන් සාරාංශයක් ලෙස උදා:

                0.00    3.58       3/3           main [2]
[3]     97.6    0.00    3.58       3         maybe_slow [3]
                3.58    0.00  120000/123003      common [1]

ඉන්ඩෙන්ට් කර ඇති ශ්‍රිතය වටා කේන්ද්‍රගත වේ ( maybe_flow). [3]යනු එම ශ්‍රිතයේ හැඳුනුම්පතයි. ශ්‍රිතයට ඉහළින්, එහි අමතන්නන් වන අතර, ඊට පහළින් ඇමතුම් ලබා ගනී.

සඳහා -O3, එම චිත්රම ප්රතිදාන වගේ මෙතන බලන්න maybe_slowසහ fastලේඛගතකිරීම බව කියන දේ වන ප්රසිද්ධ මව් නැති <spontaneous>මාධ්යයක්.

Gprof සමඟ රේඛීය-පැතිකඩ පැතිකඩ කිරීමට හොඳ ක්‍රමයක් තිබේදැයි මට විශ්වාස නැත: විශේෂිත කේත රේඛාවල `gprof` කාලය ගත කරයි

valgrind callgrind

valgrind විසින් වැඩසටහන ක්‍රියාත්මක කරන්නේ valgrind අථත්‍ය යන්ත්‍රය හරහාය. මෙය පැතිකඩ ඉතා නිවැරදි කරයි, නමුත් එය වැඩසටහනේ විශාල මන්දගාමිත්වයක් ද ඇති කරයි. මම මීට පෙර kcachegrind ගැනද සඳහන් කර ඇත්තෙමි: රූපමය ශ්‍රිත ඇමතුම් ප්‍රස්ථාරයක් ලබා ගැනීමේ මෙවලම්

callgrind යනු පැතිකඩ කේතයට වැල්ග්‍රින්ඩ්ගේ මෙවලම වන අතර kcachegrind යනු හැඹිලි ප්‍රතිදානය දෘශ්‍ය කළ හැකි KDE වැඩසටහනකි.

පළමුවෙන්ම අපි -pgසාමාන්‍ය සම්පාදනය වෙත යාමට ධජය ඉවත් කළ යුතුය, එසේ නොමැති නම් ධාවනය ඇත්ත වශයෙන්ම අසමත් වේ Profiling timer expired, ඔව්, මෙය මා විසින් කරන ලද තරම් පොදු වන අතර ඒ සඳහා ස්ටක් පිටාර ගැලීමේ ප්‍රශ්නයක් තිබුණි.

එබැවින් අපි සම්පාදනය කර ක්‍රියාත්මක වන්නේ:

sudo apt install kcachegrind valgrind
gcc -ggdb3 -O3 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
time valgrind --tool=callgrind valgrind --dump-instr=yes \
  --collect-jumps=yes ./main.out 10000

--dump-instr=yes --collect-jumps=yesඑකලස් කිරීමේ කාර්ය සාධනය බිඳවැටීම සාපේක්ෂව කුඩා අමතර පොදු කාර්ය පිරිවැයකින් බැලීමට අපට හැකි වන පරිදි මෙය තොරතුරු සක්‍රීය කරයි.

වවුලා ලකුණු, timeඅපට පවසනවා වැඩසටහන අපි මෙම උදාහරණය මගින් 15x පමණ මන්දගාමී වීම සිදු එසේ, ක්රියාත්මක කිරීමට තත්පර 29.5 වූ බව. පැහැදිලිවම, මෙම මන්දගාමිත්වය විශාල වැඩ බරක් සඳහා බරපතල සීමාවක් වනු ඇත. මෙහි සඳහන් "තාත්වික ලෝක මෘදුකාංග උදාහරණයේ" , 80x හි මන්දගාමිත්වයක් මම නිරීක්ෂණය කළෙමි.

ධාවනය මගේ නඩුවේ callgrind.out.<pid>උදා callgrind.out.8554. නම් පැතිකඩ දත්ත ගොනුවක් ජනනය කරයි . අපි එම ගොනුව පහත පරිදි බලමු:

kcachegrind callgrind.out.8554

පා g මය gprof ප්‍රතිදානයට සමාන දත්ත අඩංගු GUI එකක් පෙන්වන:

රූප විස්තරය මෙහි ඇතුළත් කරන්න

එසේම, අපි පහළ දකුණේ “කෝල් ප්‍රස්තාරය” ටැබයට ගියහොත්, අපට අසාමාන්‍ය ලෙස සුදු මායිම් සහිත පහත රූපය ලබා ගැනීම සඳහා දකුණු ක්ලික් කිරීමෙන් අපනයනය කළ හැකි ඇමතුම් ප්‍රස්ථාරයක් අපට පෙනේ :-)

රූප විස්තරය මෙහි ඇතුළත් කරන්න

මම හිතන්නේ fastඑම ප්‍රස්ථාරයේ පෙන්වන්නේ නැති නිසා kcachegrind දෘශ්‍යකරණය සරල කර තිබිය යුතු නිසා එම ඇමතුමට වැඩි කාලයක් ගත වන බැවින් මෙය සැබෑ වැඩසටහනක ඔබට අවශ්‍ය හැසිරීම විය හැකිය. දකුණු ක්ලික් මෙනුවෙහි එවැනි නෝඩ් ඉවත් කළ යුත්තේ කවදාදැයි පාලනය කිරීමට යම් සැකසුම් ඇත, නමුත් ඉක්මන් උත්සාහයකින් පසු එවැනි කෙටි ඇමතුමක් පෙන්වීමට මට එය ලබා ගත නොහැකි විය. මම fastවම් කවුළුව මත ක්ලික් කළහොත් , එය සමඟ ඇමතුම් ප්‍රස්ථාරයක් පෙන්වයි fast, එවිට එම තොගය සැබවින්ම ග්‍රහණය කර ගන්නා ලදි. සම්පුර්ණ ප්‍රස්ථාර ඇමතුම් ප්‍රස්ථාරය පෙන්වීමට කිසිවෙකු මෙතෙක් ක්‍රමයක් සොයාගෙන නැත: kcachegrind ඇමතුම් සටහනේ ඇති සියලුම ක්‍රියාකාරී ඇමතුම් පෙන්වීමට callgrind කරන්න.

සංකීර්ණ C ++ මෘදුකාංග මත TODO, මම යම් ආකාරයක ඇතුළත් කිරීම් දකිමි <cycle N>, උදා: <cycle 11>මම ක්‍රියාකාරී නම් බලාපොරොත්තු වන තැන, එයින් අදහස් කරන්නේ කුමක්ද? එය සක්‍රිය හා අක්‍රිය කිරීමට "පාපැදි අනාවරණය" බොත්තමක් ඇති බව මම දුටුවෙමි, නමුත් එයින් අදහස් කරන්නේ කුමක්ද?

perf සිට linux-tools

perfලිනක්ස් කර්නල් නියැදි යාන්ත්‍රණ පමණක් භාවිතා කරන බව පෙනේ. මෙය සැකසීමට ඉතා සරල වන අතර එය සම්පූර්ණයෙන්ම නිවැරදි නොවේ.

sudo apt install linux-tools
time perf record -g ./main.out 10000

මෙය ක්‍රියාත්මක කිරීම සඳහා තත්පර 0.2 ක් එකතු කරන ලදි, එබැවින් අපි කාලය නැණවත් ය, නමුත් commonයතුරුපුවරුවේ දකුණු ඊතලය සමඟ නෝඩය පුළුල් කිරීමෙන් පසුව මම තවමත් වැඩි උනන්දුවක් නොදක්වමි :

Samples: 7K of event 'cycles:uppp', Event count (approx.): 6228527608     
  Children      Self  Command   Shared Object     Symbol                  
-   99.98%    99.88%  main.out  main.out          [.] common              
     common                                                               
     0.11%     0.11%  main.out  [kernel]          [k] 0xffffffff8a6009e7  
     0.01%     0.01%  main.out  [kernel]          [k] 0xffffffff8a600158  
     0.01%     0.00%  main.out  [unknown]         [k] 0x0000000000000040  
     0.01%     0.00%  main.out  ld-2.27.so        [.] _dl_sysdep_start    
     0.01%     0.00%  main.out  ld-2.27.so        [.] dl_main             
     0.01%     0.00%  main.out  ld-2.27.so        [.] mprotect            
     0.01%     0.00%  main.out  ld-2.27.so        [.] _dl_map_object      
     0.01%     0.00%  main.out  ld-2.27.so        [.] _xstat              
     0.00%     0.00%  main.out  ld-2.27.so        [.] __GI___tunables_init
     0.00%     0.00%  main.out  [unknown]         [.] 0x2f3d4f4944555453  
     0.00%     0.00%  main.out  [unknown]         [.] 0x00007fff3cfc57ac  
     0.00%     0.00%  main.out  ld-2.27.so        [.] _start              

ඒ නිසා මම එය -O0කිසියම් දෙයක් පෙන්වන්නේ දැයි බැලීමට වැඩසටහනේ මිණුම් සලකුණු කිරීමට උත්සාහ කරමි , දැන් පමණක්, අවසානයේදී මට ඇමතුම් ප්‍රස්ථාරයක් පෙනේ:

Samples: 15K of event 'cycles:uppp', Event count (approx.): 12438962281   
  Children      Self  Command   Shared Object     Symbol                  
+   99.99%     0.00%  main.out  [unknown]         [.] 0x04be258d4c544155  
+   99.99%     0.00%  main.out  libc-2.27.so      [.] __libc_start_main   
-   99.99%     0.00%  main.out  main.out          [.] main                
   - main                                                                 
      - 97.54% maybe_slow                                                 
           common                                                         
      - 2.45% fast                                                        
           common                                                         
+   99.96%    99.85%  main.out  main.out          [.] common              
+   97.54%     0.03%  main.out  main.out          [.] maybe_slow          
+    2.45%     0.00%  main.out  main.out          [.] fast                
     0.11%     0.11%  main.out  [kernel]          [k] 0xffffffff8a6009e7  
     0.00%     0.00%  main.out  [unknown]         [k] 0x0000000000000040  
     0.00%     0.00%  main.out  ld-2.27.so        [.] _dl_sysdep_start    
     0.00%     0.00%  main.out  ld-2.27.so        [.] dl_main             
     0.00%     0.00%  main.out  ld-2.27.so        [.] _dl_lookup_symbol_x 
     0.00%     0.00%  main.out  [kernel]          [k] 0xffffffff8a600158  
     0.00%     0.00%  main.out  ld-2.27.so        [.] mmap64              
     0.00%     0.00%  main.out  ld-2.27.so        [.] _dl_map_object      
     0.00%     0.00%  main.out  ld-2.27.so        [.] __GI___tunables_init
     0.00%     0.00%  main.out  [unknown]         [.] 0x552e53555f6e653d  
     0.00%     0.00%  main.out  [unknown]         [.] 0x00007ffe1cf20fdb  
     0.00%     0.00%  main.out  ld-2.27.so        [.] _start              

ටෝඩෝ: -O3මරණ ද on ුවම ක්‍රියාත්මක වූයේ කුමක් ද ? එය සරලවම maybe_slowහා fastවේගවත් වූ අතර සාම්පල කිසිවක් නොලැබුණි ද? -O3ක්‍රියාත්මක කිරීමට වැඩි කාලයක් ගතවන විශාල වැඩසටහන් සමඟ එය හොඳින් ක්‍රියාත්මක වේද? මට CLI විකල්පයක් මග හැරුණාද? -Fහර්ට්ස් හි නියැදි සංඛ්‍යාතය පාලනය කිරීමට මම සොයා ගත්තෙමි , නමුත් මම එය පෙරනිමියෙන් අවසර දී ඇති උපරිමයට හරවා -F 39500(වැඩි කළ හැකිය sudo) සහ මට තවමත් පැහැදිලි ඇමතුම් නොපෙනේ.

මෙහි ඇති එක් සිසිල් දෙයක් perfනම් බ්‍රෙන්ඩන් ග්‍රෙග්ගේ ෆ්ලේම් ග්‍රාෆ් මෙවලමයි. ​​එමඟින් ඇමතුම් සිරස් වේලාවන් ඉතා පිළිවෙලට ප්‍රදර්ශනය කර ඔබට විශාල ඇමතුම් ඉක්මනින් දැක ගත හැකිය. මෙම මෙවලම ලබා ගත හැක: https://github.com/brendangregg/FlameGraph ද ඔහුගේ perf නිබන්ධන මත සඳහන් කර ඇත: http://www.brendangregg.com/perf.html#FlameGraphs මම දුවන විට perfතොරව sudoමට ලැබුණ ERROR: No stack counts foundසඳහා එසේ දැන් මම එය කරන්නේ sudo:

git clone https://github.com/brendangregg/FlameGraph
sudo perf record -F 99 -g -o perf_with_stack.data ./main.out 10000
sudo perf script -i perf_with_stack.data | FlameGraph/stackcollapse-perf.pl | FlameGraph/flamegraph.pl > flamegraph.svg

නමුත් එවැනි සරල වැඩසටහනක ප්‍රතිදානය තේරුම් ගැනීම එතරම් පහසු නැත, මන්ද අපට පහසුවෙන් maybe_slowහෝ fastඑම ප්‍රස්ථාරයේ නොපෙනේ :

රූප විස්තරය මෙහි ඇතුළත් කරන්න

වඩාත් සංකීර්ණ උදාහරණයකින් ප්‍රස්ථාරයේ තේරුම පැහැදිලි වේ:

රූප විස්තරය මෙහි ඇතුළත් කරන්න

TODO [unknown]එම උදාහරණයේ කාර්යයන් රාශියක් ඇත, එය එසේ වන්නේ ඇයි?

එය වටින තවත් පරිපූර්ණ GUI අතුරුමුහුණත් ඇතුළත් වේ:

  • Eclipse Trace Compass ප්ලගිනය: https://www.eclipse.org/tracecompass/

    නමුත් මෙහි ඇති අවාසිය නම්, ඔබ විසින් මුලින්ම පොදු හෝඩුවාවක් ආකෘතියට පරිවර්තනය කළ යුතු අතර, එය කළ හැකි perf data --to-ctfනමුත්, එය ගොඩනඟා ගත හැකි වේලාවට සක්‍රීය කළ යුතුය / perfප්‍රමාණවත් තරම් නව ඒවා තිබිය යුතුය , ඒ දෙකෙන් එකක්ම පරිපූර්ණත්වයට නොවේ උබුන්ටු 18.04

  • https://github.com/KDAB/hotspot

    මෙහි අවාසිය නම් උබුන්ටු පැකේජයක් නොමැති බව පෙනෙන අතර එය තැනීම සඳහා Qt 5.10 ක් අවශ්‍ය වන අතර උබුන්ටු 18.04 Qt 5.9 හි පවතී.

gperftools

කලින් හැඳින්වූයේ "ගූගල් කාර්ය සාධන මෙවලම්", මූලාශ්‍රය: https://github.com/gperftools/gperftools නියැදි පදනම් කරගත්.

පළමුව gperftools සමඟ ස්ථාපනය කරන්න:

sudo apt install google-perftools

එවිට, අපට gperftools CPU පැතිකඩ ආකාර දෙකකින් සක්‍රීය කළ හැකිය: ධාවන වේලාවේදී හෝ ගොඩ නැගීමේ වේලාවේදී.

ධාවන වේලාවේදී, ඔබට සොයාගත හැකි LD_PRELOADලක්ෂ්‍යය වෙත යොමු libprofiler.soකළ යුතුය locate libprofiler.so, උදා: මගේ පද්ධතියේ:

gcc -ggdb3 -O3 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libprofiler.so \
  CPUPROFILE=prof.out ./main.out 10000

විකල්පයක් ලෙස, අපට පුස්තකාලය සම්බන්ධක වේලාවට ගොඩනගා ගත හැකිය, LD_PRELOADධාවන වේලාවට ගමන් කිරීම බෙදා හරිනු ලැබේ:

gcc -Wl,--no-as-needed,-lprofiler,--as-needed -ggdb3 -O3 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
CPUPROFILE=prof.out ./main.out 10000

මෙයද බලන්න: gperftools - පැතිකඩ ගොනුව ඉවත දමා නැත

මා මෙතෙක් සොයාගෙන ඇති මෙම දත්ත බැලීමට ඇති හොඳම ක්‍රමය නම්, pcrof ප්‍රතිදානය kcachegrind ආදානය ලෙස ගන්නා එකම ආකෘතිය බවට පත් කිරීමයි (ඔව්, Valgrind-project-viewer-tool) සහ එය බැලීමට kcachegrind භාවිතා කරන්න:

google-pprof --callgrind main.out prof.out  > callgrind.out
kcachegrind callgrind.out

එම ක්‍රම දෙකෙන් එකක් ධාවනය කිරීමෙන් පසුව, අපට prof.outපැතිකඩ දත්ත ගොනුවක් ප්‍රතිදානය ලෙස ලැබේ. අපට එම ගොනුව ප්‍රස්තාරිකව SVG ලෙස දැක්විය හැකිය:

google-pprof --web main.out prof.out

රූප විස්තරය මෙහි ඇතුළත් කරන්න

එය වෙනත් මෙවලම් මෙන් හුරුපුරුදු ඇමතුම් ප්‍රස්ථාරයක් ලෙස ලබා දෙයි, නමුත් තත්පරයට වඩා සාම්පල ගණනක විචක්ෂණ ඒකකය සමඟ.

විකල්පයක් ලෙස, අපට පහත පෙළ දත්ත කිහිපයක් ද ලබා ගත හැකිය:

google-pprof --text main.out prof.out

එය ලබා දෙන්නේ:

Using local file main.out.
Using local file prof.out.
Total: 187 samples
     187 100.0% 100.0%      187 100.0% common
       0   0.0% 100.0%      187 100.0% __libc_start_main
       0   0.0% 100.0%      187 100.0% _start
       0   0.0% 100.0%        4   2.1% fast
       0   0.0% 100.0%      187 100.0% main
       0   0.0% 100.0%      183  97.9% maybe_slow

මෙයද බලන්න: google perf මෙවලම් භාවිතා කරන්නේ කෙසේද

උබුන්ටු 18.04, gprof2dot 2019.11.30, valgrind 3.13.0, perf 4.15.18, Linux kernel 4.15.0, FLameGraph 1a0dc6985aad06e76857cf2a354bd5ba0c9ce96b, gperftools 2.5-2 හි පරීක්ෂා කර ඇත.


2
පෙරනිමියෙන් පරිපූර්ණ වාර්තාව රාමු දර්ශක ලේඛනය භාවිතා කරයි. නවීන සම්පාදකයින් රාමු ලිපිනය සටහන් නොකරන අතර ඒ වෙනුවට ලේඛනය පොදු අරමුණක් ලෙස භාවිතා කරයි. විකල්පය වන්නේ -fno-omit-frame-pointerධජය සමඟ සම්පාදනය කිරීම හෝ වෙනත් විකල්පයක් භාවිතා කිරීමයි: ඔබේ තත්වය සමඟ --call-graph "dwarf"හෝ --call-graph "lbr"අනුව වාර්තා කරන්න.
ජෝර්ජ් බෙලන්

6

තනි නූල් සහිත වැඩසටහන් සඳහා ඔබට igprof , The Ignominous Profiler: https://igprof.org/ භාවිතා කළ හැකිය .

එය නියැදි පැතිකඩක් වන අතර, මයික් ඩන්ලාවිගේ ... දිගු ... පිළිතුරට අනුකූලව, ප්‍රති results ල බ්‍රවුස් කළ හැකි ඇමතුම් සිරස් ගසක ඔතා, එක් එක් ශ්‍රිතය සඳහා ගත කරන කාලය හෝ මතකය සමඟ සමුච්චිත හෝ එක් ශ්‍රිතයක්.


එය සිත්ගන්නාසුළු බව පෙනේ, නමුත් GCC 9.2 සමඟ සම්පාදනය කිරීමට අපොහොසත් වේ. (ඩේබියන් / සිද්) මම ගිතුබ් පිළිබඳ ප්‍රශ්නයක් ඉදිරිපත් කළෙමි.
බැසිල් ස්ටාරින්කෙවිච්

5

සඳහන් කිරීම වටී

  1. HPCToolkit ( http://hpctoolkit.org/ ) - විවෘත මූලාශ්‍රය සමාන්තර වැඩසටහන් සඳහා ක්‍රියා කරන අතර ප්‍රති G ල විවිධාකාරයෙන් බැලීමට GUI එකක් ඇත.
  2. Intel VTune ( https://software.intel.com/en-us/vtune ) - ඔබට ඉන්ටෙල් කම්පයිලර් තිබේ නම් මෙය ඉතා හොඳයි
  3. TAU ( http://www.cs.uoregon.edu/research/tau/home.php )

මම HPCToolkit සහ VTune භාවිතා කර ඇති අතර ඒවා කූඩාරමේ දිගු ධ්‍රැවය සොයා ගැනීමට ඉතා effective ලදායී වන අතර ඔබේ කේතය නැවත සකස් කිරීම අවශ්‍ය නොවේ (අර්ථවත් ප්‍රතිදානය ලබා ගැනීම සඳහා ඔබ CMake හි -g -O හෝ RelWithDebInfo වර්ගය භාවිතා කළ යුතුය). . TAU හැකියාවන් හා සමාන බව මම අසා ඇත්තෙමි.


4

මගේ කේතය වේගවත් කිරීම සඳහා මා භාවිතා කරන ක්‍රම දෙක මෙයයි:

CPU බැඳී ඇති යෙදුම් සඳහා:

  1. ඔබේ කේතයේ සැක සහිත කොටස් හඳුනා ගැනීමට DEBUG ප්‍රකාරයේ පැතිකඩක් භාවිතා කරන්න
  2. ඉන්පසු RELEASE මාදිලිය වෙත මාරු වී ඔබේ කේතයේ සැක සහිත කොටස් අදහස් දක්වන්න (කිසිවක් නොමැතිව එය ඇලවීම) ඔබ කාර්ය සාධනයේ වෙනස්කම් දකින තුරු.

I / O බැඳී ඇති යෙදුම් සඳහා:

  1. ඔබේ කේතයේ සැක සහිත කොටස් හඳුනා ගැනීමට RELEASE ප්‍රකාරයේ පැතිකඩක් භාවිතා කරන්න.

සැ.යු.

ඔබට පැතිකඩක් නොමැති නම්, දුප්පතාගේ පැතිකඩ භාවිතා කරන්න. ඔබගේ යෙදුම නිදොස්කරණය කිරීමේදී විරාමයක් ඔබන්න. බොහෝ සංවර්ධක කට්ටල අදහස් දැක්වූ රේඛා අංක සමඟ එකලස් වේ. ඔබ සංඛ්‍යාත්මකව ඔබගේ CPU චක්‍ර බොහොමයක් අනුභව කරන කලාපයකට ගොඩබසිනු ඇත.

CPU සඳහා, DEBUG මාදිලියේ පැතිකඩක් ඇතිවීමට හේතුව, ඔබ මුදා හැරීමේ මාදිලියේ පැතිකඩක් උත්සාහ කළහොත් , සම්පාදකයා ගණිතය, දෛශික ලූප සහ පේළිගත කිරීමේ ක්‍රියාකාරකම් අඩු කිරීමට යන අතර එය ඔබේ කේතය එකලස් කළ විට නොගැලපෙන අවුල් ජාලයක් බවට පත් කරයි. සිතියම්ගත කළ නොහැකි අවුලක් යනු ඔබේ පැතිකඩට මෙතරම් කාලයක් ගතවන දේ පැහැදිලිව හඳුනා ගැනීමට නොහැකි වනු ඇති නිසා එකලස් කිරීම ප්‍රශස්තිකරණය යටතේ ඇති ප්‍රභව කේතයට අනුරූප නොවිය හැකි බැවිනි . ඔබට මුදා හැරීමේ මාදිලියේ ක්‍රියාකාරීත්වය (උදා: කාල සංවේදී) අවශ්‍ය නම්, භාවිතා කළ හැකි කාර්ය සාධනයක් පවත්වා ගැනීමට අවශ්‍ය පරිදි නිදොස් කිරීමේ අංග අක්‍රීය කරන්න.

I / O-බැඳී සඳහා, profiler තවමත් I / O මෙහෙයුම් හඳුනා ගත හැකි නිදහස් කිරීම I / O මෙහෙයුම් එක්කෝ බාහිර හවුල් පුස්තකාල (බොහෝ විට) හෝ නරක ම නඩුව සම්බන්ධ නිසා ක්රමය, ඉතා sys- හේතු වනු ඇත ඇමතුම් බාධාකාරී දෛශිකය (එය පැතිකඩට පහසුවෙන් හඳුනාගත හැකිය).


2
+1 දුප්පත් මිනිසාගේ ක්‍රමය CPU බන්ධනයට මෙන් I / O බන්ධනය සඳහාද ක්‍රියාත්මක වන අතර, සියලු කාර්ය සාධන සුසර කිරීම DEBUG ප්‍රකාරයේදී නිර්දේශ කරමි. ඔබ සුසර කිරීම අවසන් වූ පසු, මුදා හැරීම සක්‍රිය කරන්න. ඔබේ කේතය තුළ වැඩසටහන CPU- බැඳී තිබේ නම් එය වැඩිදියුණු කරනු ඇත. මෙන්න ක්‍රියාවලියේ ගොරහැඩි නමුත් කෙටි වීඩියෝවකි.
මයික් ඩන්ලාවි

3
කාර්ය සාධන පැතිකඩ සඳහා මම DEBUG බිල්ඩ් භාවිතා නොකරමි. බොහෝ විට මා දුටුවේ DEBUG මාදිලියේ කාර්ය සාධන විවේචනාත්මක කොටස් මුදා හැරීමේ ප්‍රකාරයේදී සම්පූර්ණයෙන්ම ප්‍රශස්ත කර ඇති බවයි. තවත් ගැටළුවක් වන්නේ දෝශ නිරාකරණ කේතයේ ප්‍රකාශයන් භාවිතා කිරීම මඟින් කාර්ය සාධනයට ශබ්දය එකතු කිරීමයි.
gast128

3
ඔබ මගේ ලිපිය කිසිසේත් කියවූවාද? "ඔබට මුදා හැරීමේ මාදිලියේ ක්‍රියාකාරීත්වය (උදා: කාල සංවේදී) අවශ්‍ය නම්, භාවිතයට ගත හැකි කාර්ය සාධනයක් පවත්වා ගැනීමට අවශ්‍ය පරිදි නිදොස් කිරීමේ අංග අක්‍රීය කරන්න", "ඉන්පසු මුදා හැරීමේ මාදිලිය වෙත මාරු වී ඔබේ කේතයේ සැක සහිත කොටස් අදහස් දක්වන්න (කිසිවක් නොමැතිව එය තද කරන්න) කාර්ය සාධනයේ වෙනස්කම්. නිදොස් කිරීමේ මාදිලියේ ඇති විය හැකි ගැටළු ඇති ප්‍රදේශ පරීක්ෂා කර ඔබ සඳහන් කළ අනතුර වළක්වා ගැනීම සඳහා එම ගැටළු මුදා හැරීමේ මාදිලියේ සත්‍යාපනය කරන්නැයි මම කීවෙමි.
seo

3

loguruපැතිකඩ සඳහා මනාව භාවිතා කළ හැකි කාලරාමු සහ සම්පූර්ණ වේලාව ඇතුළත් බැවින් ඔබට ල ging ු- සටහන් රාමුවක් භාවිතා කළ හැකිය:


2

ඔබට iprof පුස්තකාලය භාවිතා කළ හැකිය:

https://gitlab.com/Neurochrom/iprof

https://github.com/Neurochrom/iprof

එය හරස් වේදිකාවක් වන අතර ඔබගේ යෙදුමේ ක්‍රියාකාරිත්වය තත්‍ය කාලීනව මැනීමට ඉඩ නොදේ. ඔබට එය සජීවී ප්‍රස්ථාරයක් සමඟ සම්බන්ධ කළ හැකිය. සම්පූර්ණ වියාචනය: මම කතෘ වෙමි.


2

උපලේඛනගත කිරීම අනුව අපට අවශ්‍ය දේ අධීක්ෂණය කිරීමට උපකාරී වන ඉතා හොඳ මෙවලමක් රැකියා ස්ථානයේ අප සතුව ඇත. මෙය බොහෝ වාර ගණනක් ප්‍රයෝජනවත් වී ඇත.

එය C ++ වලින් වන අතර එය ඔබගේ අවශ්‍යතාවයට අනුව සකස් කළ යුතුය. අවාසනාවට මට කේත බෙදාගත නොහැක, සංකල්ප පමණි. ඔබට volatileපශ්චාත් මරණ පරීක්ෂණ හෝ ල ging ු-සටහන් පද්ධතිය නැවැත්වීමෙන් පසු කාලරාමු සහ සිදුවීම් හැඳුනුම්පත අඩංගු “විශාල” බෆරයක් භාවිතා කරයි (උදාහරණයක් ලෙස මෙය ගොනුවකට දමන්න).

ඔබ සියලු දත්ත සමඟ ඊනියා විශාල බෆරය ලබා ගන්නා අතර කුඩා අතුරුමුහුණතක් එය විග්‍රහ කර වර්ණ සමඟ ( .hppගොනුවේ වින්‍යාස කර ඇති ) දෝලන දර්ශනයක් මෙන් නම (ඉහළ / පහළ + අගය) සහිත සිදුවීම් පෙන්වයි .

ඔබ කැමති දේ කෙරෙහි පමණක් අවධානය යොමු කිරීම සඳහා ජනනය කරන ලද සිදුවීම් ප්‍රමාණය ඔබ රිසිකරණය කරයි. තත්පරයට ලොග් වූ සිදුවීම් ප්‍රමාණය මත පදනම්ව අපට අවශ්‍ය CPU ප්‍රමාණය පරිභෝජනය කරන අතරම ගැටළු උපලේඛනගත කිරීම සඳහා එය අපට බොහෝ උපකාර විය.

ඔබට ගොනු 3 ක් අවශ්‍යයි:

toolname.hpp // interface
toolname.cpp // code
tool_events_id.hpp // Events ID

සංකල්පය යනු එවැනි සිදුවීම් අර්ථ දැක්වීම tool_events_id.hppය:

// EVENT_NAME                         ID      BEGIN_END BG_COLOR NAME
#define SOCK_PDU_RECV_D               0x0301  //@D00301 BGEEAAAA # TX_PDU_Recv
#define SOCK_PDU_RECV_F               0x0302  //@F00301 BGEEAAAA # TX_PDU_Recv

ඔබ මෙහි කාර්යයන් කිහිපයක් නිර්වචනය කරයි toolname.hpp:

#define LOG_LEVEL_ERROR 0
#define LOG_LEVEL_WARN 1
// ...

void init(void);
void probe(id,payload);
// etc

ඔබේ කේතයේ ඕනෑම තැනක ඔබට භාවිතා කළ හැකිය:

toolname<LOG_LEVEL>::log(EVENT_NAME,VALUE);

මෙම probeකාර්යය ඉතාමත් ඉක්මණින් ඔරලෝසුව ඇති වේලාමුද්රාව හා ලබා ගැනීම සඳහා රැස්වීමක් කිහිපයක් මාර්ග භාවිතා පසුව ප්රේරක දී ප්රවේශය සපයයි. ලොග් සිදුවීම ගබඩා කළ යුතු දර්ශකයක් ආරක්ෂිතව සොයා ගැනීමට අපට පරමාණුක වර්ධකයක් ද ඇත. ඇත්ත වශයෙන්ම බෆරය රවුම් ය.

නියැදි කේත නොමැති වීමෙන් අදහස අපැහැදිලි නොවන බව විශ්වාස කරමු.


2

ගූගල් / මිණුම් ලකුණ ගැන බොහෝ දෙනෙක් සඳහන් නොකිරීම ඇත්තෙන්ම ටිකක් පුදුමයට කරුණක් වන අතර, කේතයේ නිශ්චිත ප්‍රදේශය ඇලවීම තරමක් කරදරකාරී වන අතර, විශේෂයෙන් කේත පදනම ටිකක් විශාල නම්, කෙසේ වෙතත් මෙය සංයෝජනයෙන් භාවිතා කරන විට මට සැබවින්ම ප්‍රයෝජනවත් වියcallgrind

IMHO විසින් බාධක ඇති කරන කොටස හඳුනා ගැනීම මෙහි යතුරයි. කෙසේ වෙතත් මම පළමුව පහත සඳහන් ප්‍රශ්නවලට පිළිතුරු දී ඒ මත පදනම් වූ මෙවලමක් තෝරා ගනිමි

  1. මගේ ඇල්ගොරිතම නිවැරදිද?
  2. බෝතල් බෙල්ල බව ඔප්පු කරන අගුල් තිබේද?
  3. වැරදිකරුවෙකු බව ඔප්පු කරන කේතයේ නිශ්චිත කොටසක් තිබේද?
  4. IO, හැසිරවීම සහ ප්‍රශස්තකරණය කරන්නේ කෙසේද?

valgrindසංයෝජනයෙන් callrindසහ kcachegrindඉහත කරුණු පිළිබඳව යහපත් තක්සේරුවක් ලබා දිය යුතු අතර කේතයේ යම් කොටසක ගැටළු ඇති බව තහවුරු වූ පසු, මම යෝජනා කරන්නේ මයික්‍රෝ බෙන්ච් සලකුණක් google benchmarkආරම්භ කිරීමට හොඳ ස්ථානයක් බවයි.


මම කේතයේ කොටස් මනින විට මගේ ගූගල් මිණුම් සලකුණු අංක gprof ට වඩා නිවැරදි බව මට පෙනී ගියේය. ඔබ පැවසූ පරිදි එය ක්ෂුද්‍ර මිණුම් සලකුණු කිරීම සඳහා ඉතා හොඳයි. නමුත් ඔබට වඩාත් පරිපූර්ණ පින්තූරයක් අවශ්‍ය නම් ඔබට වෙනත් ප්‍රවේශයක් අවශ්‍ය වේ.
රාහුල් රවින්ද්‍රන්

1

-pgකේතය සම්පාදනය කිරීමේදී හා සම්බන්ධ කිරීමේදී ධජය භාවිතා කර ක්‍රියාත්මක කළ හැකි ගොනුව ක්‍රියාත්මක කරන්න. මෙම වැඩසටහන ක්‍රියාත්මක කරන අතරතුර, a.out ගොනුවේ පැතිකඩ දත්ත එකතු කරනු ලැබේ.
විවිධ වර්ගයේ පැතිකඩ දෙකක් තිබේ

1- පැතලි පැතිකඩ:
විධානය ක්‍රියාත්මක කිරීමෙන් gprog --flat-profile a.outඔබට පහත දත්ත ලැබුණි
- ශ්‍රිතය සඳහා ගත කළ මුළු කාලයෙන් කොපමණ ප්‍රතිශතයක්ද,
- ශ්‍රිතයක් සඳහා තත්පර කීයක් ගත කරනවාද - උප ශ්‍රිත සඳහා ඇමතුම් ඇතුළුව සහ බැහැර කිරීම,
- ගණන ඇමතුම්,
- ඇමතුමක සාමාන්‍ය කාලය.

2- ප්‍රස්ථාරය
අපට gprof --graph a.outඇතුළත් කරන සෑම ශ්‍රිතයක් සඳහාම පහත දැක්වෙන දත්ත ලබා ගැනීම සඳහා වන විධානය
- එක් එක් කොටසේ එක් ශ්‍රිතයක් දර්ශක අංකයකින් සලකුණු කර ඇත.
- ශ්‍රිතයට ඉහළින්, ශ්‍රිතය ලෙස හඳුන්වන ශ්‍රිත ලැයිස්තුවක් ඇත.
- ශ්‍රිතයට පහළින්, ශ්‍රිතය මගින් හැඳින්වෙන ශ්‍රිත ලැයිස්තුවක් ඇත.

වැඩි විස්තර ලබා ගැනීම සඳහා ඔබට https://sourceware.org/binutils/docs-2.32/gprof/


0

කිසිවෙකු ආර්ම් මැප් ගැන සඳහන් කර නැති නිසා, මම සී ++ විද්‍යාත්මක වැඩසටහනක් පැතිකඩ කිරීම සඳහා සිතියම සාර්ථකව භාවිතා කර ඇති බැවින් මම එය එකතු කරමි.

ආම් එම්ඒපී යනු සමාන්තර, බහු-නූල් හෝ තනි නූල් සහිත සී, සී ++, ෆෝට්‍රාන් සහ එෆ් 90 කේත සඳහා වන පැතිකඩයි. එය ප්‍රභව රේඛාවට ගැඹුරු විශ්ලේෂණයක් සහ බාධක හඳුනා ගැනීම සපයයි. බොහෝ පැතිකඩකරුවන් මෙන් නොව, සමාන්තර හා නූල් කේත සඳහා pthreads, OpenMP හෝ MPI පැතිකඩ කිරීමට හැකි වන පරිදි එය නිර්මාණය කර ඇත.

MAP යනු වාණිජ මෘදුකාංගයකි.


0

නිදොස් කිරීමේ මෘදුකාංගයක් භාවිතා කරන්න කේතය සෙමින් ක්‍රියාත්මක වන්නේ කොතැනදැයි හඳුනා ගන්නේ කෙසේද?

ඔබ චලනය වන විට ඔබට බාධාවක් ඇතැයි සිතන්න, එවිට එය ඔබේ වේගය අඩු කරයි

අනවශ්‍ය නැවත වෙන්කිරීමේ ලූප, බෆරය පිටාර ගැලීම, සෙවීම, මතක කාන්දු වීම යනාදිය මෙහෙයුම් වැඩි බලයක් පරිභෝජනය කරන අතර එය කේතයේ ක්‍රියාකාරිත්වයට අහිතකර ලෙස බලපානු ඇත, පැතිකඩ කිරීමට පෙර සම්පාදනයට -pg එකතු කිරීමට වග බලා ගන්න:

g++ your_prg.cpp -pgහෝ cc my_program.cpp -g -pgඔබේ සම්පාදකයාට අනුව

තවම එය උත්සාහ කර නැති නමුත් google-perftools ගැන හොඳ දේවල් මා අසා ඇත. එය අනිවාර්යයෙන්ම උත්සාහ කිරීම වටී.

valgrind --tool=callgrind ./(Your binary)

එය gmon.out හෝ callgrind.out.x නමින් ගොනුවක් ජනනය කරනු ඇත. මෙම ගොනුව කියවීමට ඔබට kcachegrind හෝ debugger මෙවලම භාවිතා කළ හැකිය. කුමන රේඛාවලට කොපමණ මුදලක් වැය වේද වැනි ප්‍රති results ල සහිත දේවල් පිළිබඳ චිත්‍රමය විශ්ලේෂණයක් එය ඔබට ලබා දෙනු ඇත.

මම එසේ සිතනවා

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.