第一次個人編程作業 | 論文查重系統


軟件工程 https://edu.cnblogs.com/campus/gdgy/informationsecurity1812
作業要求 https://edu.cnblogs.com/campus/gdgy/informationsecurity1812/homework/11155
作業目標 論文查重算法設計+單元測試+ JProfiler +PSP 表格+Git 管理

一、代碼文件

  • GitHub鏈接,如果能有幸幫助到你,希望能順手點個小星星
GitHub
GitHub
  • 可運行的 Jar 包已發布至倉庫的 release 包內
jar
jar

二、項目結構分析

2.1 整體流程展示

整體流程展示
整體流程展示

2.2 工程分包展示

工程分包展示
工程分包展示

2.3 類功能展示

  • bean:
  • AtomicFloat :應對並發情況的原子操作的類
  • WordGroup : 詞組的實體類
  • main:
  • MainEntrance:主函數的入口
uml
uml

2.4 運行展示

運行展示
運行展示

2.5 關鍵算法展示

使用的是余弦相似度的算法:

0p6tt1.png
0p6tt1.png

余弦相似性通過測量兩個向量的夾角的余弦值來度量它們之間的相似性。0度角的余弦值是1,而其他任何角度的余弦值都不大於1;並且其最小值是-1。從而兩個向量之間的角度的余弦值確定兩個向量是否大致指向相同的方向。兩個向量有相同的指向時,余弦相似度的值為1;兩個向量夾角為90°時,余弦相似度的值為0;兩個向量指向完全相反的方向時,余弦相似度的值為-1。這結果是與向量的長度無關的,僅僅與向量的指向方向相關。余弦相似度通常用於正空間,因此給出的值為0到1之間。

2.6 項目亮點展示

  • 運行速度快:在簡單的文本下,速度可以達到100ms以內,而在復雜的情況下,也可以達到 2.5s 內
  • 准確度高:能夠經過完整的測試,測試結果准確
  • 魯棒性高:對各種異常情況(包括空數據和各種極端情況的處理)

三、單元測試

單元測試使用了多種樣例,力求全面

測試覆蓋率
測試覆蓋率
測試結果
測試結果

四、性能測試與優化

筆者使用 JProfiler 對性能進行監控操作,下面展示的是優化前的性能測試圖

CPU Load
CPU Load
總概
總概
線程
線程
類的內存占用情況
類的內存占用情況

由線程圖可以看出,筆者優化前的程序只是一個線程,因此,如果加入線程的話,想必會提升速度

但是線程在哪里加呢?該怎么加呢?筆者不能立刻給出答案

經過一段時間的思考,想到可以在遍歷之前調用 parallelStream 的方式, 起到多線程同時訪問數據流的作用

問題又來了,如何保證並發安全呢?

答案是,封裝一個原子類,執行 CAS 操作,從而保證線程安全

不了解 CAS 的話,可以看下『深入理解 JVM 虛擬機』,或者看下筆者之前寫的這篇文章:http://xcynice.xyz/2020/04/10/yi-ye-gao-dong-jvm-xian-cheng-an-quan-yu-suo-you-hua/

五、代碼質量檢查

Code 的質量檢查是非常重要的一部分工作,本項目借助 SonarLintgit commit 之前的 review 來進行代碼的重構與優化

github 截圖
github 截圖
SonarLint
SonarLint

六、PSP 表格

PSP 各個階段 自己預估的時間(分鍾) 實際的記錄(分鍾)
計划: 明確需求和其他因素,估計以下的各個任務需要多少時間 30 45
開發 (包括下面 8 項子任務) (以下都填預估值) 218
· 需求分析 (包括學習新技術、新工具的時間) 20 30
· 生成設計文檔 (整體框架的設計,各模塊的接口,用時序圖,快速原型等方法) 13 5
· 設計復審 (和同事審核設計文檔,或者自己復審) 12 20
· 代碼規范 (為目前的開發制定或選擇合適的規范) 6 3
· 具體設計(用偽代碼,流程圖等方法來設計具體模塊) 21 30
· 具體編碼 63 75
· 代碼復審 16 20
· 測試(自我測試,修改代碼,提交修改) 32 35
報告 72 95
測試報告(發現了多少bug,修復了多少) 14 201
計算工作量 (多少行代碼,多少次簽入,多少測試用例,其他工作量) 12 15
事后總結, 並提出改進計划 (包括寫文檔、博客的時間) 56 60
總共花費的時間 (分鍾) 310 523

七、小結

因為筆者方向是 Android 開發,因此對於 Java 中的原生 IO 流的操作不太熟悉, 和對 IDEA 編譯器的各種操作(包括導包,生成UML,性能測試)不太熟悉,以至於在編碼之后花了比較多的時候去研究相關操作。

但是通過這次個人的編程作業,筆者對單元測試,性能優化,性能監測等操作有了進一步的認識,改日有空, 筆者再思考下Android 性能優化,單元測試。


如果文章對您有一點幫助的話,希望您能點一下贊,您的點贊,是我前進的動力

本文參考鏈接:

本文使用 mdnice 排版


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM