20180925-3 效能分析
一、得出程序運行時間
運行截圖如下:
第一次運行時間為 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 效能分析