第一次个人编程作业
作业属于的课程 | 计科22级12班 |
---|---|
作业要求 | 要求 |
作业目标 | 体会完成论文查重的个人项目,了解PSP表格 |
GitHub链接:链接
一、PSP表格
PSP2.1 | 描述 | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | |||
· Estimate | 估计这个任务需要多少时间 | 60 | 60 |
Development | |||
· Analysis | 需求分析 (包括学习新技术) | 120 | 180 |
· Design Spec | 生成设计文档 | 60 | 60 |
· Design Review | 设计复审 | 30 | 30 |
· Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
· Design | 具体设计 | 120 | 180 |
· Coding | 具体编码 | 600 | 660 |
· Code Review | 代码复审 | 60 | 30 |
· Test | 测试(自我测试,修改代码,提交修改) | 60 | 60 |
Reporting | |||
· Test Report | 测试报告 | 120 | 90 |
· Size Measurement | 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 30 |
合计 | 1240 | 1420 |
二、具体实现
2.1实现原理
基于simhash算法和海明距离来实现判断文本的相似程度。
算法具体参考链接。
2.2项目结构
2.3模块接口的设计和实现
主类:
mainpapercheck:使用自定义编写的模块,实现程序的具体目标。
模块:
hammingutil:通过得到的simhash值,计算海明距离。
simhash:获取字符串的simhash值。
ShortStringException:一个自定义异常类,用于在特定条件下抛出和捕获异常。
txtio:实现文件的读取和写入。
2.4主要流程
mainpapercheck根据输入文件的路径,使用txtio模块将文本内容转变为字符串类型,再通过simhash模块将字符串的simhash值计算出来,通过hammingutil模块计算出汉明距离后根据算法判断汉明距离,而ShortStringException模块负责在特定条件下抛出和捕获异常。
三、性能分析
3.1改进思路
-
simhash模块:
使用高效的哈希算法来减少计算时间。
考虑将计算过程并行化,特别是在处理大型文本时。 -
hammingutil模块:
如果需要计算大量汉明距离,可以使用更优化的算法,如位运算加速。
对于大规模数据,考虑使用矩阵计算库来提高性能。 -
txtio模块:
使用缓冲区或内存映射文件来加速文件读取和写入操作。
采用异步IO以提高处理大文件时的效率。 -
ShortStringException:
确保异常处理逻辑尽可能高效,以避免不必要的性能开销。
如果异常处理影响性能,考虑优化异常捕获策略,减少不必要的异常抛出。
优化时,确保对模块进行性能测试,找出瓶颈并针对性改进。
3.2Jprofiler截图
- 性能分析图
- 消耗最大函数
四、单元测试
4.1函数设计
-
getHammingDistanceTest():
目标:验证 getHammingDistance 函数的正确性。
步骤:从两个文件读取文本 (orig.txt 和 orig_0.8_add.txt)。计算这两个文本的 SimHash 值。计算两个 SimHash 值的汉明距离。输出汉明距离和相似度百分比。
-
shortStringExceptionTest():
目标:测试 getSimHash 对短字符串的处理。
步骤:使用短字符串 “一位真正的作家” 调用 getSimHash。输出计算得到的 SimHash 值。
-
getHashTest():
目标:验证 getHash 函数的输出。
步骤:对一组字符串 (“与”, “世上”, “众人”, “的”, “路径”, “相反”) 调用 getHash。输出每个字符串的哈希值及其长度。
-
readTxtTest():
目标:测试 readTxt 函数的正确性。
步骤:从文件 (orig.txt) 读取文本。将读取的文本按空格拆分成字符串数组。输出数组中的每个字符串。
测试覆盖率截图
五、异常处理
-
测试写入到一个不存在的目录
该测试用例尝试将数据写入一个不存在的目录,以确保 writeTxt 方法能正确处理目录不存在的异常情况。
-
testShortStringException() 方法测试字符串长度小于 200 的情况,应该返回 null