כיצד פרופיל תוכנית C ב - Linux באמצעות גנו gprof
ביצועים הוא אחד האתגרים הגדולים ביותר מתכנתים פנים תוך פיתוח תוכנה. זו הסיבה מדוע פרופיל קוד הוא אחד ההיבטים החשובים ביותר של פיתוח תוכנה, שכן הוא מאפשר לך לזהות צווארי בקבוק, קוד מת, ואפילו באגים. אם אתם מתכנתים שמפתחים יישומי תוכנה עבור לינוקס, גנו "Profproiler" של GNU הוא הכלי המתאים להשגיח עליו.
הורד והתקן
Gprof מגיע מותקן מראש עם רוב ההפצות לינוקס, אבל אם זה לא המקרה עם הפצת לינוקס שלך, אתה יכול להוריד ולהתקין אותו באמצעות שורת פקודה מנהל החבילה כמו apt-get
או yum
. לדוגמה, הפעל את הפקודה הבאה כדי להוריד ולהתקין gprof במערכות מבוססות דביאן:
sudo apt- לקבל binutils להתקין
דרישות
לפני שתשתמש ב- gprof כדי ליצור נתוני פרופיל, ודא כי תוכנית ההפעלה שלך מכילה מידע נוסף הנדרש על ידי Profiler לתפקד כראוי. זה יכול להיות מושגת על ידי הוספת -pg
הפקודה שורת הפקודה בזמן הידור הקוד שלך, בהנחה שאתה משתמש מהדר gcc
. אם אתה משתמש בפקודות נפרדות עבור קומפילציה וקישור, הוסף את אפשרות שורת הפקודה לשני הפקודות.
שימוש ב- gprof
שקול את התוכנית הבאה C כדוגמה:
#include void func2 () {int count = 0; עבור (ספירה = 0; ספירה <0XFFFFF; ספירה ++); לַחֲזוֹר; } void func1 (חלל) {int count = 0; עבור (count = 0; count <0XFF; count ++) func2 (); לַחֲזוֹר; } int main (חלל) {printf ("\ n שלום עולם! \ n"); func1 (); func2 (); Return 0; }
כמתואר בסעיף הקודם, לקמפל את הקוד עם אפשרות -pg
:
GCC -Wall -pg test.c -o הבדיקה
לאחר הידור, להפעיל את התוכנית:
./מִבְחָן
לאחר ביצוע מוצלח, התוכנית תייצר קובץ בשם "gmon.out" המכיל את המידע פרופיל, אבל בצורה גלם, כלומר אתה לא יכול לפתוח את הקובץ ישירות לקרוא את המידע. כדי ליצור קובץ קריא אנושי, הפעל את הפקודה הבאה:
בדיקה gpro.out>
פקודה זו כותבת את כל המידע על פרופילים לקריאה אנושית בפורמט "prof_output". שים לב שאתה יכול לשנות את שם קובץ הפלט לפי הנוחות שלך.
פרופיל שטוח וגרף שיחה
אם תפתח את הקובץ המכיל נתוני פרופיל, תראה שהמידע מחולק לשני חלקים: פרופיל שטוח וגרף שיחה. בעוד שהראשון מכיל פרטים כגון ספירת פונקציות, משך ביצוע כולל של פונקציה ועוד, האחרון מתאר את עץ השיחה של התוכנית, המספק פרטים על פונקציות האב והילד של פונקציה מסוימת.
לדוגמה, להלן הפרופיל שטוח במקרה שלנו:
כל מדגם נחשב כ -0.01 שניות. % עצמי עצמי מצטבר עצמי סה"כ שניות שניות שניות ms / call ms / call name 100.00 0.94 0.94 256 3.67 3.67 func2 0.00 0.94 0.00 1 0.00 936.33 func1
להלן גרף השיחה:
0% 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0% --------------------------------- [2] 100.0 0.00 0.94 ראשי [2] 0.00 0.94 1/1 func1 [ 3] 0.00 0.00 1/256 func2 [1] --------------------------------------- -------- 0.00 0.94 1/1 ראשי [2] [3] 99.6 0.00 0.94 1 func1 [3] 0.94 0.00 255/256 func2 [1] ------------- ----------------------------------
שים לב כי ההסבר המפורט של שדות אלה נמצא בקובץ המכיל מידע על פרופיל (prof_output במקרה זה) והוא נוצר בכל פעם שהפרופיל מופעל. כדי לבטל את הפרטים, השתמש בפקודה שורת הפקודה עם הפקודה gprof
.
כמה נקודות חשובות
- כדי לכתוב את הקובץ
gmon.out
כראוי, התוכנית שלך חייבת לצאת באופן תקין. הקובץ אינו מיוצר כאשר התוכנית יוצאת על ידי קריאה_exit()
או מסתיימת באופן לא תקין בשל אות שאינו מטופל. - קובץ "gmon.out" נוצר תמיד בספריית העבודה הנוכחית. לכן, ודא כי התוכנית שלך יש הרשאות מספיקות כדי ליצור קובץ בספרייה הנוכחית.
- כלי חיצוני בשם gprof2dot ניתן להשתמש כדי להמיר את הגרף שיחה מ gprof לתוך טופס גרפי.
- באמצעות gprof, אתה יכול גם לייצר רישום מקור מפורט המספק מושג על מספר הפעמים כל שורה של התוכנית בוצעה. כדי ליצור את המידע הזה, לקמפל את התוכנית עם
-g
(יחד עם אפשרות-pg
הסביר קודם לכן) ולהפעיל את הפקודהgprof
עם אפשרות שורת הפקודה.