git地址:https://git.coding.net/liu-xin/wf.git
效能分析作业具体要求如下:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2145
一、预测
要求:以《战争与和平》作为输入文件,重读向由文件系统读入。
次数 | 时间 |
第一次 | 33.972s |
第二次 | 35.884s |
第三次 | 34.393s |
平均时间 | 34.750s |
通过使用 ptime.exe测试运行时间发现自己的代码运行具体有多慢,我猜测程序的瓶颈是单词从文件中读取。
FILE *fp; fp=fopen(fileinfo.name,"r");
二、分析
首先,效能分析的软件我使用的 vs2010 自带的性能分析工具profile,由于之前我一直使用DEV C++编译环境,对于VS不太熟悉,从网上找到操作步骤,按照优化步骤一步一步进行,但是总是会弹出弹窗,说不支持重定向。如图:
(以下这一段是自己的感慨,比较啰嗦,可以略过)
我及时上网查找原因,说是2010不支持重定向,我第一想法就是把VS2010卸了,装个别的版本,看在自己下载一次又装一次花费那么久的时间上,我打算再想想其他办法,看看找到适合VS 2010的探查器装上会不会可以运行。事实证明我这个想法多愚蠢,在我还没找到探查器的组件之前,我试着重新运行程序,(划重点!!!)电脑直接黑屏,自动关机重启!!!!!我又一次的感觉到版本控制有多么重要。强忍着把VS2010卸载的冲动(因为在我电脑重装系统之前,我从控制面板中把VS卸载了,从此SQL Sever 和Office都不能启动了),又下载了VS 2012(因为我电脑系统是Win 7,所以不敢安装vs 2017),终于等待下完了,安装好了,已经从天亮等到了天黑。可是,还是会弹出上图中显示的窗口,并且我的电脑又自动重启,然后百度想试着解决这一重启问题,可是在伴随着一次次百度、修改、运行无果并且重启3次之后,我放弃了,我觉得我的电脑不该承受这么多。
后来,我上网查到了另一个Profile软件——Very Sleepy VS(下载地址http://www.codersnotes.com/sleepy/)这个软件下载非常快,功能较少,但是做功能4的效能分析也够用了。Very Sleepy VS使用步骤:
1.先打开Very Sleepy VS,接着打开cmd,输入命令行参数(此时重定向的txt应选择比较大一点的,以至于自己可以有时间进行捕获,war_and_peace.txt就可以)
2.点击Refresh,就会看到第一栏就是自己执行的.exe文件。如图:
3.程序运行结束之前快速点击两下自己所要捕捉的.exe文件,就会生成效能分析报告。
第一次分析结果:
和我预测的完全不一样,程序的瓶颈居然是单词重复计数部分。
三、优化
1.修改一:
自己查找了一下:strcmp(s1,s2) 判断两个字符串s1和s2是否相同,相同返回true ,不同返回false;在自己查找到时候发现另一个函数stricmp,它是可以比较字符串数组的一个方法或函数,但是不可以区分大小写。这也提醒了自己,单词词频重复有误,忽略了函数具体的含义。将strcmp修改为stricmp可以减少区分大小写字母运行的时间。
if(stricmp(C[i].str,s)==0)
2.修改二:
考虑到for循环比较费时间,将sum赋值给了新定义的变量z,这样for循环调用z,不用每次都传sum值。
int z; z=sum; for(i=0;i<=z;i++)
四、再次Profile
根据自己列出来的代码,修改之后再次进行profile。
优化结果:count函数总运行时间减少了,%Exclusive下降比较明显,总运行时间缩短了很多。
次数 | 时间 |
第一次 | 9.219s |
第二次 | 9.302s |
第三次 | 9.271s |
平均时间 | 9.264s |
3次平均时间比未修改之前缩短了25.486s。
五、总结
经过这次效能分析,学会了效能分析的流程,知道每一步应该做什么,也知道自己的程序的瓶颈应该去实际分析,找到瓶颈及时解决。对于自己不擅长的,不应该逃避,应该及时努力学习去解决。