20180925-3 效能分析
作业要求参见[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2145]
一、得出程序运行时间
运行截图如下:
第一次运行时间为 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%的。
六、总结
经过修改,程序的运行速度有了一定的提升,有很多地方我还没能力去修改,如果能进一步修改,程序的运行速度会有进一步的提升。在以后的程序中,我们一定要灵活运用各种工具,优化程序,提升程序运行速度。