github项目地址:https://github.com/handsomesnail/WordCountPro
PSP2.1 | PSP阶段 | 预估耗时(小时) | 实际耗时(小时) |
Planning | 计划 | 0.5 | 0.5 |
Estimate | 估计任务需要多少时间 | 0.5 | 0.5 |
Development | 开发 | 2 | 1.5 |
Analysis | 需求分析 | 0.5 | 0.5 |
Design Spec | 生成设计文档 | 0.5 | 0 |
Design Review | 设计复审 | 0.5 | 0.5 |
Coding Standard | 代码规范 | 0.5 | 0.5 |
Design | 具体设计 | 0.5 | 0.5 |
Coding | 具体编码 | 1 | 1 |
Code Review | 代码复审 | 0.5 | 0.5 |
Test | 测试 | 2 | 1.5 |
Reporting | 报告 | 0.5 | 0.5 |
Test Report | 测试报告 | 1 | 0.5 |
Size Measurement | 计算工作量 | 0.5 | 0.5 |
Postmortem | 总结 | 0.5 | 0.5 |
合计 | 11.5 | 9.5 |
基本任务:排序后将词频输出到文件
代码贡献:
//输出结果到result.txt
void Output() {
vector<pair<string, int>> tempVector(wordMap.begin(), wordMap.end());//哈希表转存到动态数组
sort(tempVector.begin(), tempVector.end(), Compare);//根据value和key排序
ofstream outfs("result.txt");
if (outfs.is_open()) {
for (int i = 0; i < tempVector.size(); i++) {
if (i >= 100)
break;
outfs << tempVector[i].first + " " << tempVector[i].second;
//cout << tempVector[i].first + " " << tempVector[i].second << endl;
if (i != 99 && i != tempVector.size() - 1)
outfs << endl;
}
}
outfs.close();
}
//传入排序的比较方法
bool Compare(pair<string, int> p1, pair<string, int> p2) {
if (p1.second != p2.second)
return p1.second > p2.second;
else return p1.first < p2.first;
}
测试用例:
ID | Item | Title | Criticality | Condition | input | Output | Result | Status | Remark |
---|---|---|---|---|---|---|---|---|---|
4_1 | output | 正常输出测试1 | H | 无 | wordMap | result.txt | result.txt | 通过 | 黑盒 |
4_2 | output | 异常输出测试2 | H | 无 | wordMap | result.txt | result.txt | 通过 | 黑盒 |
4_3 | compare | 排序比对测试3 | H | 无 | P1,P2 | false | false | 通过 | 白盒 |
4_4 | compare | 排序比对测试4 | H | 无 | P1,P2 | false | false | 通过 | 白盒 |
4_5 | compare | 排序比对测试5 | H | 无 | P1,P2 | false | false | 通过 | 白盒 |
4_6 | compare | 排序比对测试1 | H | 无 | P1,P2 | true | false | 通过 | 白盒 |
4_7 | compare | 排序比对测试2 | H | 无 | P1,P2 | true | false | 通过 | 白盒 |
质量评测:设计的测试用例均通过了测试,且测试用例运行时间短,效率符合要求。测试用例覆盖了可能出现的输入情况,并覆盖了该模块的所有分支,单元测试结果符合预期。
小组贡献:经过小组内部讨论,贡献率约开发规范
扩展任务
开发规范:选用了Google的《C++风格指南》中的规范:“果函数超过 40 行, 可以思索一下能不能在不影响程序结构的前提下对其进行分割。”在编写函数时要考虑到函数体的长度,如果该函数要实现复杂的功能,可能会造成函数过长,这样会使得代码难以阅读。
代码分析:根据规范分析组员中学号为17071的提交代码符合规范要求,符合开发规范。
代码静态扫描:
-
- 扫描工具: Cppcheck
- 下载地址: http://cppcheck.net/
-
扫描截图:
-
结果分析:
- 扫描结果显示源文件WordCountPro.cpp的117行处的指针chRtn释放内存不匹配导致内存泄漏, chRtn为字符数组, 应当使用
delete[] chRtn;
释放其内存,替换原代码中的delete chRtn;
高级任务
压力测试:
小组成员认为统计大文件可以有效测试性能,使用较大的文件对源程序进行压力测试,对程序的主要性能指标(即处理时长,以毫秒计算)进行测试和记录(debug测试框架下)。
同行评审:
组内所有成员展开同行评审,经过讨论,认为制约程序性能的因素主要在核心模块对单词存储的数据结构以及排序算法上。
在核心模块中主要因素为当前选择的set和map容器,其内部数据结构为红黑树不够高效,次要因素则是是频繁调用的函数应当设为内联函数。
性能优化:
小组成员将记录分隔符表以及单词表的set和map容器替换为unordered_map和unordered_set,内部为哈希表。并将有关函数改为内联函数。