软测第四周作业 wordcount 优化
Posted 古叫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软测第四周作业 wordcount 优化相关的知识,希望对你有一定的参考价值。
基本功能
1、github地址
https://github.com/SSS-SY/wordcount-pro
2、PSP表格
PSP2.1 |
PSP阶段 |
预估耗时 (分钟) |
实际耗时 (分钟) |
Planning |
计划 |
30 |
20 |
· Estimate |
· 估计这个任务需要多少时间 |
30 |
20 |
Development |
开发 |
470 |
550 |
· Analysis |
· 需求分析 (包括学习新技术) |
30 |
20 |
· Design Spec |
· 生成设计文档 |
20 |
20 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
30 |
20 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
30 |
30 |
· Design |
· 具体设计 |
30 |
40 |
· Coding |
· 具体编码 |
60 |
80 |
· Code Review |
· 代码复审 |
30 |
30 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
120 |
150 |
Reporting |
报告 |
90 |
90 |
· Test Report |
· 测试报告 |
30 |
30 |
· Size Measurement |
· 计算工作量 |
30 |
30 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 |
30 |
|
合计 |
470 |
500 |
3、接口实现
在讨论过后,我们将任务划分为四个模块,具体模块和分工如下:
1. 词频统计
功能描述:统计各个单词的出现次数
接口描述:输入一个字符串,输出一个map结构
负责该模块的小组成员:庹舒月
2. 词频排序
功能描述:将统计结果进行排序
接口描述:输入一个map结构,输出一个vector结构
负责该模块的小组成员:俞亮
3. 输出模块、构造和析构函数、文件长度函数
功能描述:
(1). 输出模块:输出结果到result.txt文件
(2). 构造和析构函数:类的构造和析构函数
(3). 文件长度函数:获取输入文件长度
接口描述:
(1). 输出模块:输入一个vector结构,输出一个result.txt文件
(2). 构造和析构函数: 无
(3). 文件长度函数:输出文件长度
负责该模块的小组成员:辜之皓
4. 输入模块、主函数和架构设计
功能描述:
(1). 输入模块:读取文本为一个字符串对象
(2). 主函数:调用其他小组成员的接口,是主要逻辑
接口描述:
(1). 输入模块:输出一个字符串对象
(2). 主函数: 无
负责该模块的小组成员:唐明华
实现描述
负责将统计结果输出到指定文件,构造和析构函数,文件长度函数。
输出模块十分简单,一个循环直接把数据输出到文件就行了:
void output_result(const WC::WordSet& ws) { ofstream fout("result.txt"); for (int i = 0; i < ws.size() && i < 100; i++) { fout << (ws[i]).first << \'\\t\' << (ws[i]).second << endl; } }
构造和析构函数、文件长度部分的工作主要是初始化整个类,打开输入文件,设置文件长度,关闭文件等:
explicit WC(const char* filename) : _fp(std::fopen(filename, "r")), _pool(10) {} ~WC() { std::fclose(_fp); } int file_length() { fseek(_fp, 0, SEEK_SET); fseek(_fp, 0, SEEK_END); int ret = ftell(_fp);
fseek(_fp, 0, SEEK_SET); return ret; }
三.测试用例
使用了google test框架进行测试
设计了三个测试用例来测试文件长度是否能够正常获取,以及输入错误文件时是否能够正常处理
设计了十一个测试用例测试词频计数部分,覆盖了特殊字符,多个-字符等等各种情况
设计了六个测试用例测试词频排序部分,测试了大小写,单词长度等等各种情况
测试用例列表如图所示:
运行单元测试,如图所示:
四. 小组贡献
经过讨论,各个小组成员根据自己的参与情况、代码质量和代码量得出了如下评分:
庹舒月: 0.28
辜之皓: 0.26
唐明华: 0.23
俞亮: 0.23
扩展任务
一.代码规范
因为我们选择了C++语言进行开发,所以参考了google style guide
我对其中关于类的标准进行了了仔细阅读,了解了“不要在构造函数中调用虚函数, 也不要在无法报出错误时进行可能失败的初始化”,”不要定义隐式类型转换. 对于转换运算符和单参数构造函数, 请使用 explicit
关键字“等等规则
这让我对C++类的编写有了新的认识
二.选择静态测试工具
使用了google官方提供的cpplint工具进行测试
下载链接:https://github.com/cpplint/cpplint
三.同行评审
经过一定的讨论,我们决定唐明华和庹舒月之间进行代码互评,辜之皓和俞亮之间进行代码互评
因为我们都使用了一些代码格式化的工具,所以在代码风格方面十分统一
我对俞亮的代码进行了阅读,在设计方面,有少量冗余代码,总体来说没有重大问题
俞亮对我的代码进行了评审之后,指出我在迭代器使用方面的问题,我对此进行了修改
使用cpplint工具的输出结果如图所示:
重新运行了单元测试输出结果如图所示:
四.问题总结和反思
迭代器循环的条件判断应使用!=符号,而不是<=符号
在其他方面上,我了解到了代码格式化工具的方便性和重要性,以及阅读goole style guide让我对C++代码规范有了新的认识
高级任务
一.测试数据
我们找了莎士比亚全集的英文版txt文档,有5Mb大小
使用这个数据,我们测试后发现大致需要3秒的时间才能处理完整个文件,运行截图如下:
二.组内评审
针对可能影响程序性能(制约因素),我们小组进行了组内评审,讨论。
主持:
庹舒月
评审:
唐明华、辜之皓、俞亮
评审主题:
1.影响程序性能的主要因素
2.有何建议
讨论结果:
我们讨论之后认为,主要的性能瓶颈在于需要读取整个文件之后再开始统计,因为磁盘读写的速度非常慢,导致了整个程序运行效率低
解决方案:
使用多线程,一边读取数据,一边开始统计读取部分的数据,之后再将各个部分的统计结果合并,可以大大提高性能
三.修改之后的结果
修改之后程序性能有了成倍的提高,运行时间大概在0.7秒左右,提高了大约4倍的性能
运行截图如下:
四.心得体会
经过这次作业,我深深地感受到软件开发、软件测试、软件质量三个过程是密不可分、息息相关的
6、参考链接
1. goole style guide:
https://github.com/google/styleguide/
以上是关于软测第四周作业 wordcount 优化的主要内容,如果未能解决你的问题,请参考以下文章