[LinuxFocus-icon]
<--  | Õ¾µãµØÍ¼  | Ë÷Òý  | ËÑË÷

ÐÂÎÅ | ¹ýÍùÆÚ¿¯ | Á´½Ó | ¹ØÓÚLF
[an error occurred while processing this directive]
Arnout Engelen
by Arnout Engelen
<arnouten(Q)bzzt.net>

¹ØÓÚ×÷Õß:

Arnout Engelen ÊǺÉÀ¼Nijmegen´óѧ¼ÆËã»úϵµÄѧÉú£¬Ò²ÊÇÍøÂ簲ȫ¹«Ë¾TUNIXµÄ¹ÍÔ±¡£ÔÚ¿ÕÏÐʱ¼ä£¬Ëûϲ»¶³¤Åܺʹµ×à¸ßÒôÈø¿Ë˹¡£


Ŀ¼:

 
[an error occurred while processing this directive]

ʹÓÃGProfÀ´ÓÅ»¯ÄãµÄC/C++³ÌÐò

Profiling with GProf

ÕªÒª:

ÔÚÓÅ»¯³ÌÐòµÄʱºò£¬Òª¼Çס£ºÔÚÖµµÃÓÅ»¯µÄµØ·½ÓÅ»¯£¡Ã»ÓбØÒª»¨Éϼ¸¸öСʱÀ´ÓÅ»¯Ò»¶Îʵ¼ÊÉÏÖ»ÔËÐÐ0.04ÃëµÄ³ÌÐò¡£

GProf ʹÓÃÁËÒ»ÖÖÒì³£¼òµ¥µ«ÊǷdz£ÓÐЧµÄ·½·¨À´ÓÅ»¯C/C++ ³ÌÐò£¬¶øÇÒÄܺÜÈÝÒ×µÄʶ±ð³öÖµµÃÓÅ»¯µÄ´úÂë¡£Ò»¸ö¼òµ¥µÄ°¸Àý·ÖÎö½«»áÏÔʾ£¬GProfÈçºÎͨ¹ýʶ±ð²¢ÓÅ»¯Á½¸ö¹Ø¼üµÄÊý¾Ý½á¹¹£¬½«Êµ¼ÊÓ¦ÓÃÖеijÌÐò´Ó3·ÖÖÓµÄÔËÐÐʱÓÅ»¯µ½5ÃëµÄ¡£

Õâ¸ö³ÌÐò×îÔç¿ÉÒÔ×·Ëݵ½1982Äê¹ØÓÚ±àÒëÆ÷¹¹½¨µÄÌØ±ðÌÖÂÛ´ó»á£¨the SIGPLAN Symposium on Compiler Construction£©¡£ÏÖÔÚÕâ¸ö³ÌÐò³ÉÁ˸÷ÖÖUNIX ƽ̨ÉϵÄÒ»¸ö±ê×¼¹¤¾ß¡£

_________________ _________________ _________________

 

Profiling in a nutshell

³ÌÐò¸ÅÒª·ÖÎöµÄ¸ÅÄî·Ç³£¼òµ¥£ºÍ¨¹ý¼Ç¼¸÷¸öº¯ÊýµÄµ÷ÓúͽáÊøÊ±¼ä£¬ÎÒÃÇ¿ÉÒÔ¼ÆËã³ö³ÌÐòµÄ×î´óÔËÐÐʱµÄ³ÌÐò¶Î¡£ ÕâÖÖ·½·¨ÌýÆðÀ´ËƺõÒª»¨·ÑºÜ¶àÆøÁ¦¡ª¡ªÐÒÔ˵ÄÊÇ£¬ÎÒÃÇÆäʵÀëÕæÀí²¢²»Ô¶£¡ÎÒÃÇÖ»ÐèÒªÔÚÓà gcc ±àÒëʱ¼ÓÉÏÒ»¸ö¶îÍâµÄ²ÎÊý('-pg')£¬ÔËÐÐÕâ¸ö£¨±àÒëºÃµÄ£©³ÌÐò£¨À´ËѼ¯³ÌÐò¸ÅÒª·ÖÎöµÄÓйØÊý¾Ý£©£¬È»ºóÔËÐÐ'gprof'ÒÔ¸ü·½±ãµÄ·ÖÎöÕâЩ½á¹û¡£  

°¸Àý·ÖÎö: Pathalizer

ÎÒʹÓÃÁËÒ»¸öÏÖʵÖÐʹÓõijÌÐòÀ´×÷ΪÀý×Ó£¬ÊÇ pathalizerµÄÒ»²¿·Ö: ¼´event2dot£¬Ò»¸ö½«Â·¾¶¡°Ê¼þ¡±ÃèÊöÎļþת»¯ÎªÍ¼Ðλ¯¡°dot¡±ÎļþµÄ¹¤¾ß£¨executable which translates a pathalizer 'events' file to a graphviz 'dot' file£©¡£

¼òµ¥µÄ˵£¬Ëü´ÓÒ»¸öÎļþÀïÃæ¶ÁÈ¡¸÷ÖÖʼþ£¬È»ºó½«ËüÃǷֱ𱣴æÎªÍ¼Ïñ(ÒÔҳΪ½Úµã£¬ÇÒ½«Ò³ÓëÒ³Ö®¼äµÄת±ä×÷Ϊ±ß£©£¬È»ºó½«ÕâЩͼÏñÕûºÏΪһÕÅ´óµÄͼÐΣ¬²¢±£´æÎªÍ¼Ðλ¯µÄ'dot'¸ñʽÎļþ¡£  

¸ø³ÌÐò¼ÆÊ±

ÏÈÈÃÎÒÃǸøÎÒÃÇδ¾­ÓÅ»¯µÄ³ÌÐò¼ÆÒ»ÏÂʱ£¬¿´¿´ËüÃǵÄÔËÐÐÒª¶àÉÙʱ¼ä¡£ÔÚÎҵļÆËã»úÉÏʹÓÃevent2dot²¢ÓÃÔ´ÂëÀïµÄÀý×Ó×÷ΪÊäÈ루´ó¸Å55000µÄÊý¾Ý£©£¬´óÖÂÒªÈý·Ö¶àÖÓ£º

real    3m36.316s
user    0m55.590s
sys     0m1.070s
 

³ÌÐò·ÖÎö

ҪʹÓÃgprof ×÷¸ÅÒª·ÖÎö£¬ÔÚ±àÒëµÄʱºòÒª¼ÓÉÏ'-pg' Ñ¡ÏÎÒÃǾÍÊÇÈçÏÂÖØÐ±àÒëÔ´ÂëÈçÏ£º
g++ -pg dotgen.cpp readfile.cpp main.cpp graph.cpp config.cpp -o event2dot

ÏÖÔÚÎÒÃÇ¿ÉÒÔÔÙ´ÎÔËÐÐevent2dot£¬²¢Ê¹ÓÃÎÒÃÇÇ°ÃæÊ¹ÓõIJâÊÔÊý¾Ý¡£Õâ´ÎÎÒÃÇÔËÐеÄʱºò£¬event2dotÔËÐеķÖÎöÊý¾Ý»á±»ËѼ¯²¢±£´æÔÚ'gmon.out'ÎļþÖУ¬ÎÒÃÇ¿ÉÒÔͨ¹ýÔËÐÐ'gprof event2dot | less'À´²é¿´½á¹û¡£

gprof »áÏÔʾ³öÈçϵĺ¯Êý±È½ÏÖØÒª£º

 % cumulative  self              self     total
 time seconds  seconds  calls s/call s/call name
43.32   46.03  46.03 339952989  0.00  0.00 CompareNodes(Node *,Node *)
25.06   72.66  26.63    55000   0.00  0.00 getNode(char *,NodeListNode *&)
16.80   90.51  17.85 339433374  0.00  0.00 CompareEdges(Edge *,AnnotatedEdge *)
12.70  104.01  13.50    51987   0.00  0.00 addAnnotatedEdge(AnnotatedGraph *,Edge *)
 1.98  106.11   2.10    51987   0.00  0.00 addEdge(Graph *,Node *,Node *)
 0.07  106.18   0.07        1   0.07  0.07 FindTreshold(AnnotatedEdge *,int)
 0.06  106.24   0.06        1   0.06 28.79 getGraphFromFile(char *,NodeListNode *&,Config *)
 0.02  106.26   0.02        1   0.02 77.40 summarize(GraphListNode *,Config *)
 0.00  106.26   0.00    55000   0.00  0.00 FixName(char *)
¿ÉÒÔ¿´³ö£¬µÚÒ»¸öº¯Êý±È½ÏÖØÒª: ³ÌÐòÀïÃæ¾ø´ó²¿·ÖµÄÔËÐÐʱ¶¼±»Ëü¸øÕ¼¾ÝÁË¡£  

ÓÅ»¯

ÉÏÃæ½á¹û¿ÉÒÔ¿´³ö£¬Õâ¸ö³ÌÐò´ó²¿·ÖµÄʱ¼ä¶¼»¨ÔÚÁËCompareNodesº¯ÊýÉÏ£¬Óà grep ²é¿´Ò»ÏÂÔò·¢ÏÖCompareNodes Ö»ÊDZ»CompareEdgesµ÷ÓÃÁËÒ»´Î¶øÒÑ, ¶øCompareEdgesÔòÖ»±»addAnnotatedEdgeµ÷Ó᪡ªËüÃǶ¼³öÏÖÔÚÁËÉÏÃæµÄÇåµ¥ÖС£Õâ¶ù¾ÍÊÇÎÒÃÇÓ¦¸Ã×öµãÓÅ»¯µÄµØ·½Á˰ɣ¡

ÎÒÃÇ×¢Òâµ½addAnnotatedEdge±éÀúÁËÒ»¸öÁ´±í¡£ËäÈ»Á´±íÊÇÒ×ÓÚʵÏÖ£¬µ«ÊÇȴʵÔÚ²»ÊÇ×îºÃµÄÊý¾ÝÀàÐÍ¡£ÎÒÃǾö¶¨½«Á´±í g->edges Óöþ²æÊ÷À´´úÌæ: Õ⽫»áʹµÃ²éÕÒ¸ü¿ì¡£  

½á¹û

ÏÖÔÚÎÒÃÇ¿´Ò»ÏÂÓÅ»¯ºóµÄÔËÐнá¹û:
real    2m19.314s
user    0m36.370s
sys     0m0.940s
 

µÚ¶þ±é

ÔÙ´ÎÔËÐÐ gprof À´·ÖÎö:
%   cumulative self           self    total
 time   seconds seconds calls  s/call  s/call name
87.01     25.25  25.25  55000    0.00    0.00 getNode(char *,NodeListNode *&)
10.65     28.34   3.09  51987    0.00    0.00 addEdge(Graph *,Node *,Node *)
¿´ÆðÀ´ÒÔǰռÓôóÁ¿ÔËÐÐʱµÄº¯ÊýÏÖÔÚÒѾ­²»ÔÙÊÇÕ¼ÓÃÔËÐÐʱµÄ´óÍ·ÁË£¡ÎÒÃÇÊÔÒ»ÏÂÔÙÓÅ»¯Ò»ÏÂÄØ£ºÓýڵã¹þÏ£±íÀ´È¡´ú½ÚµãÊ÷¡£

Õâ´Î¼òÖ±ÊǸö¾Þ´óµÄ½ø²½:

real    0m3.269s
user    0m0.830s
sys     0m0.090s
 

ÆäËû C/C++ ³ÌÐò·ÖÎöÆ÷

»¹ÓÐÆäËûºÜ¶à·ÖÎöÆ÷¿ÉÒÔʹÓÃgprof µÄÊý¾Ý, ÀýÈçKProf (½ØÆÁ) ºÍ cgprof¡£ËäȻͼÐνçÃæµÄ¿´ÆðÀ´¸üÊæ·þ£¬µ«ÎÒ¸öÈËÈÏΪÃüÁîÐеÄgprof ʹÓøü·½±ã¡£
 

¶ÔÆäËûÓïÑԵijÌÐò½øÐзÖÎö

ÎÒÃÇÕâÀï½éÉÜÁËÓÃgprof À´¶ÔC/C++ µÄ³ÌÐò½øÐзÖÎö£¬¶ÔÆäËûÓïÑÔÆäʵһÑù¿ÉÒÔ×öµ½: ¶Ô Perl,ÎÒÃÇ¿ÉÒÔÓÃDevel::DProf Ä£¿é¡£ÄãµÄ³ÌÐòÓ¦¸ÃÒÔperl -d:DProf mycode.plÀ´¿ªÊ¼£¬²¢Ê¹ÓÃdprofppÀ´²é¿´²¢·ÖÎö½á¹û¡£Èç¹ûÄã¿ÉÒÔÓÃgcj À´±àÒëÄãµÄJava ³ÌÐò£¬ÄãÒ²¿ÉÒÔʹÓÃgprof£¬È»¶øÄ¿Ç°»¹Ö»Ö§³Öµ¥Ï̵߳ÄJava ´úÂë¡£  

½áÂÛ

¾ÍÏñÎÒÃÇÒѾ­¿´µ½µÄ£¬ÎÒÃÇ¿ÉÒÔʹÓóÌÐò¸ÅÒª·ÖÎö¿ìËÙµÄÕÒµ½Ò»¸ö³ÌÐòÀïÃæÖµµÃÓÅ»¯µÄµØ·½¡£ÔÚÖµµÃÓÅ»¯µÄµØ·½ÓÅ»¯£¬ÎÒÃÇ¿ÉÒÔ½«Ò»¸ö³ÌÐòµÄÔËÐÐʱ´Ó 3·Ö36Ãë ¼õÉÙµ½ÉÙÓÚ 5Ã룬¾ÍÏñ´ÓÉÏÃæµÄÀý×Ó¿´µ½µÄÒ»Ñù¡£  

References

 

¶ÔÕâÆªÎÄÕ·¢±íÆÀÂÛ

ÿƪÎÄÕ¶¼Óи÷×Եķ´À¡Ò³Ãæ¡£ÔÚÕâ¸öÒ³ÃæÀÄú¿ÉÒÔÌá½»ÆÀÂÛ£¬Ò²¿ÉÒԲ鿴ÆäËû¶ÁÕߵįÀÂÛ£º




Ö÷Ò³ÓÉLinuxFocus±à¼­×éά»¤
© Arnout Engelen
"some rights reserved" see linuxfocus.org/license/
http://www.LinuxFocus.org
·­ÒëÐÅÏ¢:
en --> -- : Arnout Engelen <arnouten(Q)bzzt.net>
en --> CN: С Íô (homepage)

2005-05-07, generated by lfparser version 2.52