2017秋-软件工程第三次作业(2)
效能分析
1,对于效能分析,看了别人的速度之后我只能表示很无奈。首先承认的一点是,我还没有弄明白什么是重定向。
先粘贴3条我在2017年9月26日凌晨测试的结果。此程序在运行初期我以为它坏掉了,耐性等了几分钟后才发现是程序自己运行缓慢。
2有关“重定向”目前,我个人理解的“重定向”就是将输入设置为从文件内读取数据进入到程序中。在本程序中我一开始就使用了这种方法,程序从文件内读取数据。相关代码如下:
在第6行中,该语句实现了从文件内读取数据,而不是重控制台读取数据。如果这么理解正确的话,我想,自己完成了“重定向功能”。
1 void OpenFile(const string fileName, list<Word> &lWord) 2 { 3 int paragraphNum = 1; 4 int sentenceNum = 1; 5 int wordNum = 1; 6 ifstream fin(fileName.c_str());//这里就是我期待的重定向功能? 7 if (!fin) 8 { 9 cout << "File open error!\n";//如果没有打开文件,则输出打开文件错误。路径不对出现很多错误 10 return; 11 } 12 char ch;//定义了一个字符型变量,用于读取字符 13 while (fin.get(ch))//只要能读取字符,就进行循环,直到文章结束 14 { 15 if (ch == '\n')//若读到回车,就是切换段落 16 { 17 paragraphNum++;//段落数字增加 18 sentenceNum = 1;//句子数量置1(没用) 19 wordNum = 1;//单词数量置1(没用) 20 } 21 else 22 { 23 char temp[50];//定义一个字符类型数组,用于存储单词 24 int icount = 0;//用于记录某字母在单词中的位置 25 while ((ch != '\n') && (ch != '.') && (ch != '!') && (ch != '?') && (ch != ' ') && (ch != ',') && (ch != '、') && (ch != '"') && (ch != '\'') && (ch != '(') && (ch != ')'))//只要没有遇到诡异的符号,都进行记录(如果我写,就写成,如果遇到字母,就进行记录) 26 { 27 if (ch >= 'A'&& ch <= 'Z'){ 28 ch += 32; 29 } 30 //变换大小写,统一成为小写字母 31 temp[icount] = ch;//单词数组temp赋值, 32 icount++;//变量增加 33 fin.get(ch);//获取下一个字符 34 } 35 temp[icount] = '\0';//给单词末尾增加结束符“字符串结束符”ASCII对应空 36 if (icount >= 1) 37 { 38 lWord.push_back(Word(temp, paragraphNum, sentenceNum, wordNum));//将单词存入lword List中。 39 } 40 if ((ch == '.') || (ch == '!') || (ch == '?')) 41 { 42 sentenceNum++;//句子数量增加 43 wordNum = 0;//单词位置计数置零 44 } 45 if ((ch == ' ') || (ch == ';') || (ch == '、')) 46 { 47 wordNum++;//遇到空格增加单词数量 48 } 49 } 50 } 51 fin.close();//记得关闭文件
3作业第0项任务
在9月26号中午的测试中,我的程序表现良好,我有重新测试四次,分别记录时间。(请忽略一些小的瑕疵)
第一次测试:
第二次
第三次
第四次
这4次的时间分别是:249.779s、105.661s、100.081s、99.616s。可见后四次的测试中后3次稳定在100秒左右。在程序运行过程中,我使用了“桌面应用”资源监视器来监视cpu相关的数据。
正在运行过程中,“平均cpu”大概在20%左右。截图如下。
4作业第1项任务:通过 profile 找出程序的瓶颈.
在使用profile之前,我已经猜想到了程序中导致运行缓慢的地方。因为我的程序设计过程中,我先将所有单词做一次统计,记录所有单词的单词数量,然后再输出排序后的单词。cpu使用百分率我没有找到,不过我猜想程序的瓶颈部分在于这个代码段:
word.sort();
word.reverse();
那么第一次对于单词的统计所消耗的时间是无用的,我找到了相关的地方删去了有关统计单词数量的循环和为单词排序的语句。我的程序运行时间获得了显著的改进!
如上2截图证明,删去有关“排序、循环”等部分无用的过程,可以让我的程序加速“40秒”这是非常巨大的进步!
5作业第2项任务:性能分析,找到瓶颈。
我使用的是visual2013,其中自带这非常好的性能分析组件。如下展示一些过程截图
摘要截图如下:
果然,不出我所料,sort()函数是最浪费时间的。
除了上一图,我还找到了最浪费时间的2个函数。(作业中提到找3个,其实主要的时间花销就在这2个函数上!!!)
在检测过程中也遇到了一些小麻烦:“检测”这一项目没有运行,我也很绝望啊。。。所以看到伙伴们都能有cpu占用率曲线等等的图线感觉很羡慕。完成作业要紧,之后再去调整。
6作业第3项任务:尽量优化程序。
我采用删除函数、删除无用的步骤等手段让程序运行时间减少了原有时间的40%。之后还在修改
7作业第4项任务:再次运行程序截图。
8作业第5项任务:教师运行程序。
额,虽然我的程序慢的要死,大概1分钟才可以运行结束,不过还在不断修改!