欢迎使用迈尔斯·迪夫
![迈尔斯·迪夫](https://github.com/codedownio/myers-diff/actions/workflows/ci.yml/badge.svg)
这是Myers文本diff算法的快速Haskell实现它的灵感来源于这个帖子和应该具有相同的\(O(\分钟(长度(a),长度(b))\)空间复杂性。该实现使用未装箱的可变向量来提高性能。
这个回购还可以构建其他几个版本用于基准测试比较,在标志后面进行门控。
-功能(_M)
将从单一用户包裹。
-联邦国防军
将使用差异包裹。
与其他库的比较
这个差异该包还实现了Myers算法,但空间效率较低。那个包裹做广告\(O(D^2)\)空间复杂性,其中\(D\)是两个输入之间的差异数。在最坏的情况下,\(D=最大值(长度(a),长度(b)),因此空间使用可以是输入长度的二次方。
基准
您可以通过运行./run_all_benchmarks.sh
。可以在中找到完整的结果./基准_结果
。所有基准测试都在Intel i9-13900K上运行。
TL;博士:
- 这些基准测试侧重于不同大小的输入,其中插入或删除一个约30个字符的区域。
迈尔斯·迪夫
速度约为2.5倍,并且随着输入量的增加(大约100k个字符),优势也会增加。
迈尔斯·迪夫
小输入的空间效率提高了5倍,10k字符输入缩小到1.5倍,100k字符输入减少到1.3倍。
当然,还可以运行其他基准测试。未来的工作可能涉及使用多个单独编辑和/或不同大小的编辑测试输入。如果您想讨论特定的工作量,请提交一个问题。
时间:小插入
测试场景:生成随机输入\(否)字符,然后插入随机字符串\(\leq 30\)字符以生成修改后的输入。生成100个这样的对并比较迈尔斯·迪夫
具有差异
使用标准.
![small_插入.png](./benchmark_results/small_insert.png)
输入大小(字符) |
迈尔斯·迪夫 |
差异 |
加速 |
10 |
408辆 |
1.07毫秒 |
2.6倍 |
100 |
587美元 |
1.53毫秒 |
2.6倍 |
1000 |
1.81毫秒 |
3.46毫秒 |
1.9倍 |
10000 |
16.6毫秒 |
40.8毫秒 |
2.5倍 |
100000 |
188毫秒 |
823毫秒 |
4.4倍 |
时间:小删除
测试场景:与小插入相同,但这次删除\(\leq 30\)第二个输入中的字符。
![小删除.png](./benchmark_results/small_delete.png)
这些结果与小插件的结果非常相似。
空间:小插入
测试场景:与小插入时间测试相同。在这个测试中,我们使用权衡.
输入大小(字符) |
myers-diff(字节) |
差异(字节) |
差异/myers-Diff |
10 |
1,681,120 |
8,904,176 |
5.3倍 |
100 |
3,619,928 |
13833520个 |
3.8倍 |
1000 |
20,044,048 |
31,669,480 |
1.6倍 |
10000 |
171,103,240 |
250,594,080 |
1.5倍 |
100000 |
1,666,421,824 |
2,172,753,512 |
1.3倍 |