软测第四周作业 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/

转载于:https://www.cnblogs.com/ZhihaoGu/p/8744812.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值