软件工程——第三次作业(2)效能分析
本次作业要求:https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/956
本人代码地址:https://git.coding.net/ss505072461/wf.git
————————————————————————————————————————————————
首先我下载了老师提供的计时器ptime.exe:https://git.coding.net/younggift/word_count_demo.git
在命令行环境下进行了3次时间测试,测试文本内容以及结果如下:
测试文本内容:
而测试的三次结果:
而三次测试也可以看出来,我的程序统计效率十分低下,一个五十多万单词的文章进行词频统计居然需要近5分钟的时间……(在测试了别人的几秒后,虽然早有心理准备,但是还是备受打击啊……)
接下来,我在Visual Studio 2015中,使用性能探查器进行了一次性能上的测试:
经过了再一次漫长的5分钟等待,样本分析报告出来了:
由于我在上一周制作这个程序之前,对于C#语言完全没有了解,导致在编程实现目标的时候,将所有实现目标功能的代码全部塞在了main主函数中,因此,在分析结果中,wf.Program.Main执行了近乎全部的工作。
CPU的使用百分率在5分钟这个比较长(对于这个小程序来说5分钟确实是一个很差的效率)的时间段里,基本上维持在一个很平稳的状态(标记中显示是11-12%)。
在效能测试开始之前,我对于我程序中效率最差的地方就已经有了大致的认知,是在实现词频统计功能的过程中,统计完相同单词后,将其从单词数组中剔除的那一步骤代码:
1 for (int i = 0; i < sWord; i++) 2 { 3 countWord[i] = 1; 4 for (int j = i + 1; j < sWord; j++) 5 { 6 if (textArray[i].Equals(textArray[j])) 7 { 8 countWord[i]++; 9 //删除掉被统计过的单词 10 for (int k = j + 1; k < sWord; k++) 11 textArray[k - 1] = textArray[k]; 12 sWord--; 13 j--; 14 } 15 } 16 }
因为在我测试功能的时候,为了方便判断分离单词等步骤是否正确执行,我在读入文件后,会输出一行总词数的数字,而在此之后继续执行词频统计,而在总词数输出过后的时间是十分漫长的……事实上,测试后的结果也证明了这一点。
对于程序的优化,最重要的部分还是词频统计功能的实现部分需要优化,每次查询到一个单词后就要将其之后的所有单词进行一次移动操作是非常浪费时间的,但是由于我对于语言不熟练,还不能将单词和其词频用更简练有效的方法绑定在一起,只能单纯地运用位置操作实现对齐的功能,因此优化方面暂时没有方法做到更好(在语言精进之后,掌握了更多语言的使用方法后,一定会有更加效率的算法)。另外还有一个可以优化的位置,就是程序最后要求输出的结果是经过排序后词频前十的单词及其词频,我运用的是最容易实现,但是效率很低的冒泡排序,这个排序算法也可以进行优化,若使用快速排序等更加好的排序算法,也会使程序的运行效率大大提升。