亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

使用GProf來優化你的C/C++程序

2020-05-23 14:24:23
字體:
來源:轉載
供稿:網友

GProf 使用了一種異常簡單但是非常有效的方法來優化C/C++ 程序,而且能很容易的識別出值得優化的代碼。一個簡單的案例分析將會顯示,GProf如何通過識別并優化兩個關鍵的數據結構,將實際應用中的程序從3分鐘的運行時優化到5秒的。

  這個程序最早可以追溯到1982年關于編譯器構建的特別討論大會(the SIGPLAN Symposium on Compiler Construction)?,F在這個程序成了各種UNIX 平臺上的一個標準工具。

  _________________ _________________ _________________

  Profiling in a nutshell

  程序概要分析的概念非常簡單:通過記錄各個函數的調用和結束時間,我們可以計算出程序的最大運行時的程序段。這種方法聽起來似乎要花費很多氣力——幸運的是,我們其實離真理并不遠!我們只需要在用 gcc 編譯時加上一個額外的參數('-pg'),運行這個(編譯好的)程序(來搜集程序概要分析的有關數據),然后運行'gprof'以更方便的分析這些結果。

  案例分析: Pathalizer

  我使用了一個現實中使用的程序來作為例子,是 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,并使用我們前面使用的測試數據。這次我們運行的時候,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 只是被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 的數據, 例如

  

  

使用GProf來優化你的C/C++程序

  

  KProf (截屏) 和 cgprof。雖然圖形界面的看起來更舒服,但我個人認為命令行的gprof 使用更方便。

  對其他語言的程序進行分析

  我們這里介紹了用gprof 來對C/C++ 的程序進行分析,對其他語言其實一樣可以做到: 對 Perl,我們可以用Devel::DProf 模塊。你的程序應該以perl -d:DProf mycode.pl來開始,并使用dprofpp來查看并分析結果。如果你可以用gcj 來編譯你的Java 程序,你也可以使用gprof,然而目前還只支持單線程的Java 代碼。

  結論

  就像我們已經看到的,我們可以使用程序概要分析快速的找到一個程序里面值得優化的地方。在值得優化的地方優化,我們可以將一個程序的運行時從 3分36秒 減少到少于 5秒,就像從上面的例子看到的一樣。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91在线播放国产| 欧美伊久线香蕉线新在线| 亚洲精品美女久久| 最近2019年好看中文字幕视频| 亚洲国产小视频| 久久国产精品网站| 国产视频精品自拍| 国产精品黄页免费高清在线观看| 亚洲成人久久一区| 97碰碰碰免费色视频| 日韩在线小视频| 在线观看视频亚洲| 亚洲级视频在线观看免费1级| 97在线视频国产| 国产盗摄xxxx视频xxx69| 91在线视频导航| 亚洲人成亚洲人成在线观看| 青草热久免费精品视频| 日日噜噜噜夜夜爽亚洲精品| 92版电视剧仙鹤神针在线观看| 欧美性感美女h网站在线观看免费| 中文字幕一区二区三区电影| 日韩在线观看视频免费| 亚洲新声在线观看| 精品视频www| 亚洲色图综合久久| 欧美情侣性视频| 夜色77av精品影院| 日韩欧美国产黄色| 亚洲第一福利网| 亚洲激情免费观看| 欧洲亚洲免费在线| 久久久午夜视频| 亚洲欧美日韩第一区| 国产精品久久9| 中文字幕欧美日韩va免费视频| 亚洲天堂av网| 91成人国产在线观看| 精品国产一区二区三区久久久| 久久亚洲春色中文字幕| 亚洲精品国产拍免费91在线| 中文字幕久久精品| 狠狠躁夜夜躁人人爽天天天天97| 亚洲午夜国产成人av电影男同| 日韩av在线影院| 亚洲视屏在线播放| 亚洲精品视频网上网址在线观看| 国产精品美女在线| 亚洲女性裸体视频| 91美女高潮出水| 欧美色欧美亚洲高清在线视频| 91亚洲午夜在线| 欧美性色19p| 国产精品九九久久久久久久| 日韩国产精品一区| 国产精品高潮呻吟久久av无限| 日韩av不卡电影| 欧美视频免费在线观看| 国产免费一区视频观看免费| 日韩欧美成人精品| 欧亚精品中文字幕| 欧美黑人一级爽快片淫片高清| 国产一区二区三区网站| 国产精品色悠悠| 欧美国产日韩免费| 亚洲国产高清自拍| 国产区精品视频| 4p变态网欧美系列| 社区色欧美激情 | 狠狠久久五月精品中文字幕| 永久免费毛片在线播放不卡| 91久久中文字幕| 97视频在线观看亚洲| 日韩中文在线不卡| 亚洲最大的av网站| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲欧美国产精品va在线观看| 在线观看亚洲区| 精品亚洲一区二区三区在线观看| 岛国av一区二区在线在线观看| 国产精品va在线| 欧美www在线| 狠狠躁夜夜躁久久躁别揉| 精品中文字幕在线| 久久手机免费视频| 亚洲国产精品久久91精品| 欧美成aaa人片免费看| 日韩av一区在线| 91在线观看免费高清| 国产婷婷成人久久av免费高清| 久久97精品久久久久久久不卡| 欧美成人精品h版在线观看| 91精品国产99| 中文字幕亚洲欧美日韩高清| 欧美丰满老妇厨房牲生活| 成人精品aaaa网站| 欧美精品免费在线| 欧美激情xxxxx| 一区二区三欧美| 国产精品久久一区| 日韩中文字幕在线看| 不卡av电影院| 成人高h视频在线| 91精品视频在线看| 久久精品国产69国产精品亚洲| 国产精品免费一区| 亚洲午夜国产成人av电影男同| 欧美成人精品激情在线观看| 欧美成在线视频| 成人黄色在线免费| 精品久久久香蕉免费精品视频| 欧美黑人视频一区| 亚洲国产免费av| 欧美一区二粉嫩精品国产一线天| 欧美日本高清一区| 精品偷拍一区二区三区在线看| 色综合色综合网色综合| 亚洲淫片在线视频| 国产精品福利在线观看网址| 91精品视频在线| 亚洲乱码av中文一区二区| 亚洲欧美第一页| 中文字幕久热精品视频在线| 久久99精品久久久久久青青91| 清纯唯美日韩制服另类| 亚洲精品一区中文字幕乱码| 91美女片黄在线观| 中文字幕亚洲在线| 精品久久在线播放| 亚洲国产精品yw在线观看| 亚洲国产成人精品久久久国产成人一区| 欧美激情精品久久久久久蜜臀| 日韩在线播放视频| 中文字幕免费国产精品| 伊人成人开心激情综合网| 国产精品普通话| 久久色在线播放| 欧美性理论片在线观看片免费| 久久久久久久国产精品视频| 欧美黑人视频一区| 久久视频精品在线| 亚洲乱亚洲乱妇无码| 亚洲欧洲视频在线| 一级做a爰片久久毛片美女图片| 欧美一级大片视频| 国产欧美日韩高清| 久久视频在线观看免费| 亚洲国产一区二区三区在线观看| 日韩在线精品视频| 日韩精品极品视频| 国产日韩欧美一二三区| 亚洲精品日韩激情在线电影| 亚洲欧美国产精品| 最近中文字幕2019免费| 国产亚洲一区精品| 69国产精品成人在线播放| 国产成人亚洲综合91精品| 亚洲精品按摩视频| 国产精品丝袜一区二区三区| 91成人天堂久久成人| 久久视频免费在线播放| 2020欧美日韩在线视频| 91在线视频精品| 久久久人成影片一区二区三区|