2个版本
0.2.1 | 2024年7月22日 |
---|---|
0.2.0 | 2024年6月7日 |
#138 在 压缩
每月下载量155次
在smdiff-merger中使用
120KB
2K SLoC
SMDIFF编码器
第二次尝试的一个不错的编码器。我的第一次尝试是天真无知的,我在这个过程中学到了很多。我尝试在编码器的第二次迭代中应用这一点。这个比我的第一次尝试快了两倍,并且使用少得多的内存。然而,它不如xdelta3在速度或匹配方面好,但它完全是用可读的、完全安全的Rust编写的。从粗略的基准测试来看,它比xdelta3慢2-3倍,在找到与xdelta3相同的src匹配方面相当(没有二级压缩器)。仅使用纯压缩,这个编码器并不出色。它的速度与xd3相当,但不知何故,它没有找到所有好的匹配,因此需要一些工作(大约20%更大的delta文件)。所以并不出色,但这是一段相当新的代码。二级压缩器使它在使用二级压缩器时(在大小上,而不是速度上)更接近xd3。
改进
src和trgt的主要编码器使用类似的设计,因此对其中一个的改进将提高两者的性能。我尽量保持它们的效率。它们广泛地模仿xdelta3寻找匹配的方法。然而,我可能没有完全做对,因为我没有找到xdelta3那样的好匹配。匹配算法却有点自我喂养:更好的匹配由于编码器如何前进和评估输出流中的每个位置的性质,导致更好的匹配。因此,找到更好的匹配将提高找到更好匹配的可能性。编码过程的速度也会随着找到更好的匹配而加快(我们评估的位置更少)。因此,找到好的匹配是双倍重要的。显然,我的当前设计在哈希和/或表存储方面有一些问题。我对我的目标匹配器(压缩器)比xd3差很多感到有些困惑,而源匹配器几乎一样(但也不够好)。这让我相信我有一些小错误。
我认为主要的速度提升将来自于更复杂的构建过程和更多的常量。这正是xd3所做的,这也使得其阅读起来非常困难。基本上,xd3为不同的预设提供了一个特定的编码器,而我的编码器是运行时配置的。我相信这里确实有很强的性能,但就目前而言,这个性能已经足够好,易于追踪。
API
尝试创建一个流接口可能是有意义的。由于当前的编码器将所有内容都放入内存,这实际上并没有什么意义。我认为这会让API显得笨拙,在目前阶段增加了一层间接。代码需要集成分块读取输入和逐步处理。我已经为准备这个功能让API接受读取器和写入器。理想情况下,我们会实例化一个包装器,它将Src文件(可选)以及补丁输出写入器包装起来。然后我们输入trgt文件。不确定最佳的人体工程学,所以暂时保持现状。
粗略性能
这并没有通过任何正式的基准测试来完成,但旨在说明各种编码器/压缩速度和压缩值。
gcc-2.95.1 Encode (s) | Decode (s) | 2.92.2 Delta | Compression (%)
-------------------------------------------------------------------------------------------
1. raw size 55,746,560 | | | 55,797,760 |
2. compress - | | | 19,939,390 |
3. gzip - | | | 12,973,443 |
4. zstd(22) | 26.554 | 0.193 | 7,983,434 | 14.308
5. brotli(best) | 65.742 | 0.109 | 8,097,690 | 14.513
6. Vcdiff - | | | 15,358,786 |
7. Smdiff - | 5.148 | 0.217 | 16,594,811 | 29.741
8. xdelta3 - | 5.200 | - | 13,913,641 | 24.940
9. Vcdiff-d - | | | 100,971 |
10.Smdiff-d | 0.735 | 0.035 | 82,296 | 0.147
11.xdelta3-d | 0.360 | - | 73,174 | 0.130
12.Vcdiff-dcw - | | | 256,445 |
13.Smdiff-dcw | 1.009 | 0.034 | 73,887 | 0.132
14.xdelta3-dcw | 0.407 | - | 66,687 | 0.120
(the following are with secondary compressors, to highest compression)
----------------------------+--------------+--------------+--------------+-----------------
Smdiff-d + smdiff | 0.753 | 0.033 | 82336 | 0.148
Smdiff-d + zstd | 0.760 | 0.036 | 41142 | 0.074
Smdiff-d + brotli | 0.842 | 0.035 | 38198 | 0.068
Smdiff-dcw + smdiff | 0.827 | 0.034 | 73917 | 0.132
Smdiff-dcw + zstd | 0.848 | 0.034 | 40645 | 0.073
Smdiff-dcw + brotli | 0.921 | 0.034 | 38040 | 0.068
xdelta3-dcw + lzma | 0.407 | - | 35734 | 0.064
依赖项
~4MB
~72K SLoC