1. 程式人生 > >軟測第四周作業 wordcount 優化

軟測第四周作業 wordcount 優化

tor 磁盤 總結 ret 關鍵字 無法 ima 參與 格式化工具

基本功能

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 優化