个人作业
一、预计用时:
由于写过类似的程序,但使用的是并不熟悉的c++,预计用时8-12个小时。
二、实际用时:20小时左右。
学习c++的一些用法花费了比我想象中更长的时间。java有专门的File类用来操作文件,但百度了半天也没有发现c++专门操作文件的类。最终使用的是_finddata_t结构体。从了解这个结构体以及相关函数的用法到编写出一个能遍历文件夹的函数大概用了4个小时。
之后编写三个mode大概用了8个小时,其中包括正则表达式的使用,以及算法的设计。经过反复的调试得出了正确的程序。
之后的时间一直在想办法做优化。
三、优化过程:
程序的主要时间都花费在regex_match()函数上。这是c++自带的正则表达式匹配的函数。因此我打算通过减少进行匹配的次数来提高速度。
最初是在判断前后两个单词是否是连续单词时,对两个单词都使用regex_match(),这样在判断第1、2个单词时对第2个单词先判断了一遍,在判断第2、3个单词时对第2个单词又判断了一遍。
之后修改成在判断连续单词时,在前一次循环中保存对第二个单词的匹配结果,然后在下一次循环中直接使用这个结果。这样每一遍循环之后只调用一次regex_match()。
尽管如此,在我的电脑上运行大一点的测试样例时,速度还是非常慢。
四、测试样例:
1、123file ba ;asd123, as621312 basdwe ad?a21sa 用于测试能否准确识别单词。
结果:
asd123: 1
basdwe: 1
2、file File FIle
测试大小写。
结果:
FIle: 3
3、file File FIle
测试正常向的两个词。
结果:
File FIle: 2
4、123file File FIle
测试较复杂的两个词,测试会不会把123file中的file单独提取出来。
结果:
File FIle: 1
5、file 3File FIle file asd;bad
测试较复杂的两个词,主要测试多个空格和其他分隔符相隔的两个词。
结果:
FIle file: 1
file asd: 1
6、file 3File FIle file asd;bad
测试三个词。
结果:
FIle file asd: 1
7、在两个位于不同层次路径的文件中输入:file 3File FIle file asd;bad
测试能否正确递归访问及统计词汇。
结果:正好是测试5中的两倍。
FIle file: 2
file asd: 2
8、看了有同学使用老师的博客做测试样例,我也测试了一下:
结果:
一个单词(只显示一部分):
The: 28
FILE: 21
Word: 17
your: 17
and: 12
program: 10
You: 9
Output: 7
directory: 7
text: 7
Blog: 6
Code: 6
WILL: 6
name: 6
this: 6
Analysis: 5
frequency: 5
performance: 5
Alphanumerical: 4
Each: 4
For: 4
Words: 4
cases: 4
两个(列出最多的十个):
text file: 6
your program: 6
the text: 4
Alphanumerical characters: 3
test cases: 3
time you: 3
Blog Requirement: 2
Code Quality: 2
Quality Analysis: 2
Will output: 2
三个:
the text file: 4
Code Quality Analysis: 2
contains word ranking: 2
file contains word: 2
make sure your: 2
sure your program: 2
text file contains: 2
the program should: 2
time you spent: 2
word ranking list: 2
和同学对过了,应该是正确的。
五、收获
感觉这个项目主要还是让我熟悉了一下c++的用法和vs2012的用法(尤其是性能分析)。
还有一点,这个项目让我头一次意识到优化的重要性。原来写的程序由于不是很复杂,运行时间都比较短,因此没有太关注时间。这次当我运行程序时,发现如此之慢,让我开始思考如何让程序变快,哪怕只是快一点点。