第一次个人编程作业 | 论文查重系统
软件工程 | https://edu.cnblogs.com/campus/gdgy/informationsecurity1812 |
---|---|
作业要求 | https://edu.cnblogs.com/campus/gdgy/informationsecurity1812/homework/11155 |
作业目标 | 论文查重算法设计+单元测试+ JProfiler +PSP 表格+Git 管理 |
一、代码文件
GitHub链接,如果能有幸帮助到你,希望能顺手点个小星星
可运行的 Jar
包已发布至仓库的release
包内
二、项目结构分析
2.1 整体流程展示
2.2 工程分包展示
2.3 类功能展示
bean:
AtomicFloat
:应对并发情况的原子操作的类WordGroup
: 词组的实体类
main:
MainEntrance
:主函数的入口
2.4 运行展示
2.5 关键算法展示
使用的是余弦相似度的算法:
余弦相似性通过测量两个向量的夹角的余弦值来度量它们之间的相似性。0度角的余弦值是1,而其他任何角度的余弦值都不大于1;并且其最小值是-1。从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向。两个向量有相同的指向时,余弦相似度的值为1;两个向量夹角为90°时,余弦相似度的值为0;两个向量指向完全相反的方向时,余弦相似度的值为-1。这结果是与向量的长度无关的,仅仅与向量的指向方向相关。余弦相似度通常用于正空间,因此给出的值为0到1之间。
2.6 项目亮点展示
运行速度快:在简单的文本下,速度可以达到100ms以内,而在复杂的情况下,也可以达到 2.5s 内 准确度高:能够经过完整的测试,测试结果准确 鲁棒性高:对各种异常情况(包括空数据和各种极端情况的处理)
三、单元测试
单元测试使用了多种样例,力求全面
四、性能测试与优化
笔者使用
JProfiler
对性能进行监控操作,下面展示的是优化前的性能测试图
由线程图可以看出,笔者优化前的程序只是一个线程,因此,如果加入线程的话,想必会提升速度
但是线程在哪里加呢?该怎么加呢?笔者不能立刻给出答案
经过一段时间的思考,想到可以在遍历之前调用 parallelStream
的方式, 起到多线程同时访问数据流的作用
问题又来了,如何保证并发安全呢?
答案是,封装一个原子类,执行 CAS
操作,从而保证线程安全
不了解
CAS
的话,可以看下『深入理解 JVM 虚拟机』,或者看下笔者之前写的这篇文章:http://xcynice.xyz/2020/04/10/yi-ye-gao-dong-jvm-xian-cheng-an-quan-yu-suo-you-hua/
五、代码质量检查
Code 的质量检查是非常重要的一部分工作,本项目借助
SonarLint
和git commit
之前的review
来进行代码的重构与优化
六、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
性能优化,单元测试。
如果文章对您有一点帮助的话,希望您能点一下赞,您的点赞,是我前进的动力
本文参考链接:
余弦相似度算法 Intellij Idea 将java项目打包成jar,cmd运行该jar 详述 IntelliJ IDEA 提交代码前的 Code Analysis 机制 Java内存分析工具--IDEA的JProfiler和JMeter插件 解决JetBrains系列Git push失败问题 【Java】关于Java8 parallelStream并发安全的思考 IDEA怎么生成UML类图 idea中maven导入jar包
本文使用 mdnice 排版