第一次个人编程作业 | 论文查重系统

软件工程 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 排版

posted @   许朋友爱玩  阅读(657)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示
CONTENTS