1. 程式人生 > >20180925-3 效能分析

20180925-3 效能分析

出現 ima 函數調用 clas 查詢 string函數 col 運行 core

一、得出程序運行時間

運行截圖如下:

技術分享圖片

第一次運行時間為 0.942 s

技術分享圖片

第二次運行時間為 0.826 s

技術分享圖片

第三次運行時間為 0.861 s

平均運行時間為:0.876 s

CPU參數:Intel(R) Core(TM) i5-4200M CPU @ 2.50GHz 2.50GHz

二、猜測程序瓶頸

猜測一:每次查詢map容器該單詞是否出現過比較費時,因為個單詞都要去查詢一遍,優化過後可能運行快5%。

    if(mp[str]==0){
        s.push_back(str);
        mp[str]++;
        totalword++;
    }else{
        mp[str]
++; }

猜測二:判斷是否是單詞組成元素比較費時,因為要去判斷每一個字符,優化過後可能運行快10%。

if(isalpha(ch)!=0||(ch==\‘&&len>0)||ch==-||(ch>=0&&ch<=9&&len>0))

三、利用profile找出瓶頸

CPU使用率截圖:

技術分享圖片

函數調用次數及運行時間截圖:

技術分享圖片

這兒可以看到最耗時的三個函數分別是:map的查找比較函數,string的拼接函數以及判斷是否為字母函數。

map查找比較函數和string拼接函數:

if (mp[str] == 0
) { s.push_back(str); mp[str]++; totalword++; } else { mp[str]++; }

判斷字母函數:

if (isalpha(ch) != 0 || (ch == \‘&&len>0) || ch == - || (ch >= 0&&ch <= 9&&len>0))

分析:map和string的兩個函數可能需要調用堆棧,消耗時間比較多,而判斷字母函數因為執行的次數多,導致最後運行時間就比較多。

四、優化程序

map和string想不出怎麽優化,判斷函數直接和字母進行比較。相應的函數變化如下:

if (text[i]>=a&&text[i]<=z) {
        ...
}
else if (text[i]>=A&&text[i]<=Z) {
    ...
}
else if ((text[i]== &&len>0)||text[i]==) {
        ...
}

五、再次profile測試

ptime運行時間截圖:

技術分享圖片

第一次運行時間為 0.826 s

技術分享圖片

第二次運行時間為 0.817 s

技術分享圖片

第三次運行時間為 0.827 s

平均運行時間為:0.823 s

比未修改時快了0.053s

CPU使用率截圖:

技術分享圖片

函數調用次數及運行時間截圖:

技術分享圖片

可以看到map和string函數運行時間比例基本上沒有變化,判斷字母函數找不到了,其他運行函數的運行時間百分比都是低於0.1%的。

六、總結

經過修改,程序的運行速度有了一定的提升,有很多地方我還沒能力去修改,如果能進一步修改,程序的運行速度會有進一步的提升。在以後的程序中,我們一定要靈活運用各種工具,優化程序,提升程序運行速度。

20180925-3 效能分析