软工2017第三周作业——词频效能分析
这篇博客中要写以下几点:
1、准备工作
2、词频效能分析
3、优化
4、再次profile
5、push wf.exe的git地址
一、准备工作
效能分析作业要求地址:https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/956
1、写好功能四,重定向输入,以war_and_peace文件为例,运行结果如图:
2、连续三次运行,程序三次运行时间和CPU参数,截图如下:
三次平均运行时间:0.679s
3、猜测此程序的瓶颈:正则表达式。因为上周完成作业的时候,我用两种方法过滤标点符号,得到的结果都不一样,我认为再次优化之后,会让输出结果更精确。
fileword = Regex.Replace(fileword, @"[^a-zA-Z0-9\u4e00-\u9fa5\s]", " ");//利用正则表达式过滤标点符号
fileword = Regex.Replace(fileword, "[!@#$%^&*()`,./;':\"<>`?...]", " ");
filewords = fileword.Split();//分割字符串
二、词频效能分析
1、 最开始进行效能分析的时候VS系统报错说是不能对重定向文件进行效能分析,认为是程序运行时间长短的关系,不能捕捉到程序运行,然后不能对它进行分析,然后增大输入量来使程序运行时间加长,设计实验1证明不能对重定向文件进行性能分析分析与程序运行时间没有关系,如实验1所示:
实验1:增高输入量,使用CPU使用率工具和CPU采样方法,将3M多的war_and_peace.txt与60M多的1.txt文件,进行两方面的比较:
(1)程序运行时间:前者是0.530s,后者是5.136s,证明增大输入量,程序运行时间明显变长了,证据如图:
(2)然后对这两个重定向文件进行性能分析,证明了程序运行时间长短和对重定向文件进行性能分析没有直接关系,与此同时也证明了增大输入量对性能分析的影响不大,证据如图所示:
2、用性能向导工具和检测方法对程序进行性能分析,先在VS的项目这一栏选择wf属性进行参数设置,具体步骤如图所示:
然后出现了下面这个图的错误,但是还是出现了分析报告,如图所示:
三、优化
对于上面截图中执行单个工作最多的三个函数都是调用的VS内部函数:Split(),哈希表,我不知道怎么进行优化,然后我优化了我猜测的瓶颈:
优化:将正则表达式改为ch[],其余代码未做修改,只是将代码段一改为代码段二代码展示如图
代码段一
fileword = Regex.Replace(fileword, @"[^a-zA-Z0-9\u4e00-\u9fa5\s]", " ");//利用正则表达式过滤标点符号 fileword = Regex.Replace(fileword, "[!@#$%^&*()`,./;':\"<>`?...]", " "); filewords = fileword.Split();//分割字符串
代码段二
char[] ch = { ' ', '!', ',', ':', '.', '"', ';' };
filewords = fileword.Split(ch, StringSplitOptions.RemoveEmptyEntries);
程序三次运行时间结果如图所示:
平均时间是0.389s,未修改之前的平均时间是0.679s,根据计算的word总数,计算单词总量的结果更精确了,将war_and_peace.txt里的内容复制到word中计算的单词总数是567385,用正则表达式之后的单词总数是769198,用ch[]之后的单词总数是535625,相比较修改后的程序结果更精确了,截图为证:
四、再次profile
再次profile,截图如下:
五、push wf.exe的git地址:https://git.coding.net/liusx0303/CountWords__standardinput.git