首先放PSP表格:

由于开始几天在设计完整体实现方法之后慌了一段时间,所以导致全部实际用时比26.5h多许多。

一、性能分析

最开始的那个程序因为实在是太慢了所以在这里并不打算分析,后来全部重新写了一遍,对最后的程序进行分析可以得到:

可以看到插入无序map和统计的函数占用了最多的时间,而这两个函数内部的时间占用为:

在这个函数里面还是插入无序map占用了最多的时间,插入函数内部时间占用为:

可以看到是从map中找元素花费了最多的时间,由于词组一般比单词要长所以词组的find函数比单词的需要更多的时间,自己尝试写过find函数但是不如库函数速度快。

二、总结

通过这次的作业,学到了许多之前没有的知识,比如map,一些字符函数,文件操作以及,最重要的,调试方法。c++的一些功能在开始的几天学习一下基本可以使用了,但是并不能具体的理解其实现,在这次作业里面也没有用到一些复杂深入的功能,所以这也不能算是很大的收获,但是调试的方法却学到了许多,主要是条件编译和性能探查器。开始时由于是输出到屏幕上去看结果,所以使用cout,后面要求输出到文件里面,所以使用文件输出,但是在修改的过程中可能也会出现一些问题,所以有时还需要在屏幕上看结果,每一次都把所有文件输出语句改成cout输出语句特别麻烦,所以我使用了条件编译的方法,当需要输出到屏幕上的时候定义coutput,输出到文件的时候定义fileoutput,修改时只需要把定义注释即可。然后是性能探查器,这个工具可以看到函数的调用关系,每一个函数的用时,函数中每一条语句的用时以及内存的使用情况,通过这个工具可以很直接的找到影响性能最大的地点,通过对这个地方进行优化可以很大的提升程序的效率。

三、后续linux系统调试

由于在github上上传的程序有bug忘记修改所以实际提交的linux版本并不能运行,有变量名称忘记修改了,在这里也不做过多分析,运行时消耗的时间与windos系统的差不多,还是插入无序map和统计的函数占用了最多的时间,这两个函数其实只有插入函数是重点需要优化的,但是也不知道该怎么优化所以就不优化了,结果与windos系统的也有差异,可能是因为两个系统对一些转义符号有不同的定义导致。然后在linux系统下有一些函数不支持,比如fopen_s和map的insert,这是由于在我的linux系统下g++版本较低,这些函数并不能实现,可以使用fopen和具体赋值的方式来代替,或者升级g++的版本,总之这次移植是比较失败的,后续还需要学习更多不同系统的知识。