2个版本

0.2.1 2024年7月22日
0.2.0 2024年6月7日

#138压缩

Download history 138/week @ 2024-06-04 5/week @ 2024-06-11 23/week @ 2024-07-16 117/week @ 2024-07-23 15/week @ 2024-07-30

每月下载量155次
smdiff-merger中使用

MIT许可证

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