File: README

package info (click to toggle)
snappy-tools 1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 168 kB
  • sloc: cpp: 442; sh: 217; makefile: 14
file content (199 lines) | stat: -rw-r--r-- 12,075 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
snappy-tools
https://builds.sr.ht/~nabijaczleweli/snappy-tools
https://todo.sr.ht/~nabijaczleweli/snappy-tools  (report at <mailto:~nabijaczleweli/snappy-tools@todo.sr.ht>)
https://lists.sr.ht/~nabijaczleweli/snappy-tools <mailto:~nabijaczleweli/snappy-tools@lists.sr.ht>
https://man.sr.ht/~nabijaczleweli/snappy-tools

I saw some "snappy framed data"-compressed files in my Firefox profile,
and there didn't seem to be a decompressor for them in Debian.
Upstream homepage at https://google.github.io/snappy/; you need libsnappy-dev to build.

snappy(1): Snappy compression and decompression with and without framing
usage: snappy    [-f]   data > snappy.sn|.sz
       snappy    [-f] < data > snappy.sn|.sz
       snappy -d [-i]          snappy.sn|.sz
       snappy -d [-i] <        snappy.sn|.sz
usage: unsnappy [-i]   snappy.sn|.sz
       unsnappy [-i] < snappy.sn|.sz

Manual available online at https://srhtcdn.githack.com/~nabijaczleweli/snappy-tools/blob/man/snappy-tools.pdf


Naturally, the snappy framing format requires CRC32Cing the data.
There is a hardware-accelerated implementation for arm64
SSE4.2-capable i386/x32/amd64, and CRCC-capable loong64 hosts:
          soft      crc32q      CRC32C
  E5645   357 MiB/s  6598 MiB/s
  5800X3D 527 MiB/s 11085 MiB/s
  MT8173  246 MiB/s             5016 MiB/s (Cortex-A72)


Note that upstream's spiel is 250M/s compression and 500M/s decompression (on "an i7"),
and ~.55 of the ratio of gzip -1 for HTML:
  $ curl -SL https://github.com/google/snappy/ > data
  $ snappy data > /dev/null
  data: 286555 -> 81458 (28.43%)
  $ snappy -f data > /dev/null
  data: 286555 -> 81520 (28.45%)
  $ gzip -c1 data | wc -c
  58254                 (20%)
  $ lz4 -vc1 data > /dev/null
  *** LZ4 command line interface 64-bits v1.9.4, by Yann Collet ***
  Compressed 286555 bytes into 73853 bytes ==> 25.77%
  $ zstd -vc1 data > /dev/null
  *** Zstandard CLI (64-bit) v1.5.4, by Yann Collet ***
  data                 : 17.47%   (   280 KiB =>   48.9 KiB, /*stdout*\)
compare with the Silesia compression corpus' HTML-formatted "webster" file
(https://sun.aei.polsl.pl//~sdeor/index.php?page=silesia):
  $ curl -SL https://sun.aei.polsl.pl//~sdeor/corpus/webster.bz2 | bzcat > webster
  $ snappy webster > /dev/null
  webster: 41458703 -> 20211213 (48.75%)
  $ snappy -f webster > /dev/null
  webster: 41458703 -> 20218182 (48.77%)
  $ gzip -c1 webster | wc -c
  14977104                      (36.13%)
  $ lz4 -vc1 data > /dev/null
  *** LZ4 command line interface 64-bits v1.9.4, by Yann Collet ***
  Compressed 41458703 bytes into 20149249 bytes ==> 48.60%
  $ zstd -vc1 data > /dev/null
  *** Zstandard CLI (64-bit) v1.5.4, by Yann Collet ***
  webster              : 32.97%   (  39.5 MiB =>   13.0 MiB, /*stdout*\)


Speed testing on tmpfs on bookworm/E5645/DDR3-1600, which an i7 is very much not:
  $ while :; do cat data || break; done | head -c 100M > 100M
  $ hyperfine -N 'snappy 100M' 'snappy -f 100M' 'gzip -c1 100M' 'lz4 -c1 100M' 'zstd -c1 100M'
  snappy 100M          (mean ± σ):  272.9 ms ±  2.5 ms  [User: 248.2 ms, System: 24.4 ms]
  snappy -f 100M       (mean ± σ):  298.8 ms ±  5.6 ms  [User: 275.7 ms, System: 22.8 ms]
  gzip -c1 100M        (mean ± σ): 1733   ms ± 10   ms  [User:  1.709 s, System: 0.024 s]
  lz4 -c1 100M         (mean ± σ):  329.9 ms ±  8.1 ms  [User: 298.1 ms, System: 31.6 ms]
  zstd -c1 100M        (mean ± σ):  128.1 ms ± 10.0 ms  [User: 140.2 ms, System: 58.0 ms]
  Summary
    'zstd -c1 100M' ran                                     780.640 MiB/s
      2.13 ± 0.17 times faster than 'snappy 100M'           366.434 MiB/s
      2.33 ± 0.19 times faster than 'snappy -f 100M'        334.672 MiB/s
      2.58 ± 0.21 times faster than 'lz4 -c1 100M'          303.122 MiB/s
     13.53 ± 1.06 times faster than 'gzip -c1 100M'          57.703 MiB/s

  snappy -d 100M.sn    (mean ± σ):  206.8 ms ±  3.4 ms  [User: 132.9 ms, System: 73.6 ms]
  snappy -d 100M.sz    (mean ± σ):  153.5 ms ±  4.9 ms  [User: 141.6 ms, System: 11.6 ms]
  gzip -dc 100M.gz     (mean ± σ):  709.0 ms ±  5.6 ms  [User: 698.3 ms, System: 10.4 ms]
  lz4 -dc 100M.lz4     (mean ± σ):  133.8 ms ±  6.1 ms  [User: 118.5 ms, System: 15.1 ms]
  zstd -dc 100M.zst    (mean ± σ):   61.3 ms ±  5.5 ms  [User:  59.8 ms, System: 10.2 ms]
  Summary
    'zstd -dc 100M.zst' ran                                1631.321 MiB/s
      2.18 ± 0.22 times faster than 'lz4 -dc 100M.lz4'      747.384 MiB/s
      2.50 ± 0.24 times faster than 'snappy -d 100M.sz'     651.465 MiB/s
      3.37 ± 0.31 times faster than 'snappy -d 100M.sn'     483.558 MiB/s
     11.57 ± 1.05 times faster than 'gzip -dc 100M.gz'      141.043 MiB/s


  snappy webster       (mean ± σ):  199.5 ms ±  5.3 ms  [User: 189.7 ms, System: 9.6 ms]
  snappy -f webster    (mean ± σ):  205.8 ms ±  4.7 ms  [User: 191.6 ms, System: 13.9 ms]
  gzip -c1 webster     (mean ± σ): 1032   ms ±  7   ms  [User:  1.019 s, System: 0.012 s]
  lz4 -c1 webster      (mean ± σ):  216.9 ms ±  5.7 ms  [User: 202.0 ms, System: 14.6 ms]
  zstd -c1 webster     (mean ± σ):  367.4 ms ±  5.2 ms  [User: 368.9 ms, System: 35.3 ms]
  Summary
    'snappy webster' ran                                    198.185 MiB/s
      1.03 ± 0.04 times faster than 'snappy -f webster'     192.119 MiB/s
      1.09 ± 0.04 times faster than 'lz4 -c1 webster'       182.287 MiB/s
      1.84 ± 0.05 times faster than 'zstd -c1 webster'      107.615 MiB/s
      5.17 ± 0.14 times faster than 'gzip -c1 webster'       38.312 MiB/s

  snappy -d webster.sn (mean ± σ):  134.0 ms ±  3.9 ms  [User: 100.9 ms, System: 32.9 ms]
  snappy -d webster.sz (mean ± σ):  109.2 ms ±  2.3 ms  [User: 100.1 ms, System: 8.9 ms]
  gzip -dc webster.gz  (mean ± σ):  394.8 ms ±  5.0 ms  [User: 389.3 ms, System: 5.2 ms]
  lz4 -dc webster.lz4  (mean ± σ):   67.8 ms ±  2.1 ms  [User:  57.7 ms, System: 9.9 ms]
  zstd -dc webster.zst (mean ± σ):  110.1 ms ±  3.1 ms  [User: 109.2 ms, System: 11.3 ms]
  Summary
    'lz4 -dc webster.lz4' ran                               583.157 MiB/s
      1.61 ± 0.06 times faster than 'snappy -d webster.sz'  362.070 MiB/s
      1.62 ± 0.07 times faster than 'zstd -dc webster.zst'  359.110 MiB/s
      1.98 ± 0.08 times faster than 'snappy -d webster.sn'  295.060 MiB/s
      5.82 ± 0.19 times faster than 'gzip -dc webster.gz'   100.147 MiB/s


Speed testing on tmpfs on sid@2024-02-14/5800X3D/DDR4-3600, which is several i7s:
  snappy 100M          (mean ± σ):  100.1 ms ±  1.6 ms  [User:  88.7 ms, System: 11.3 ms]
  snappy -f 100M       (mean ± σ):  108.8 ms ±  0.6 ms  [User:  98.7 ms, System: 10.1 ms]
  gzip -c1 100M        (mean ± σ):  710.5 ms ±  8.4 ms  [User: 696.3 ms, System: 14.0 ms]
  lz4 -c1 100M         (mean ± σ):  148.2 ms ±  1.8 ms  [User: 111.8 ms, System: 36.3 ms]
  zstd -c1 100M        (mean ± σ):   40.2 ms ±  1.2 ms  [User:  32.8 ms, System: 40.6 ms]
  Summary
    zstd -c1 100M ran                                      2487.562 MiB/s
      2.49 ± 0.08 times faster than snappy 100M             999.000 MiB/s
      2.71 ± 0.08 times faster than snappy -f 100M          919.117 MiB/s
      3.69 ± 0.12 times faster than lz4 -c1 100M            674.763 MiB/s
     17.69 ± 0.57 times faster than gzip -c1 100M           140.745 MiB/s

  snappy -d 100M.sn    (mean ± σ):  111.1 ms ±  1.2 ms  [User:  67.3 ms, System: 43.6 ms]
  snappy -d 100M.sz    (mean ± σ):   81.9 ms ±  1.3 ms  [User:  76.1 ms, System: 5.7 ms]
  gzip -dc 100M.gz     (mean ± σ):  351.8 ms ±  2.6 ms  [User: 348.1 ms, System: 3.6 ms]
  lz4 -dc 100M.lz4     (mean ± σ):   45.7 ms ±  0.6 ms  [User:  41.3 ms, System: 4.2 ms]
  zstd -dc 100M.zst    (mean ± σ):   16.7 ms ±  0.2 ms  [User:  16.2 ms, System: 3.5 ms]
  Summary
    zstd -dc 100M.zst ran                                  5988.023 MiB/s
      2.73 ± 0.05 times faster than lz4 -dc 100M.lz4       2188.183 MiB/s
      4.89 ± 0.10 times faster than snappy -d 100M.sz      1221.001 MiB/s
      6.63 ± 0.11 times faster than snappy -d 100M.sn       900.090 MiB/s
     21.00 ± 0.30 times faster than gzip -dc 100M.gz        284.252 MiB/s


  snappy webster       (mean ± σ):   75.7 ms ±  1.1 ms  [User:  72.2 ms, System: 3.4 ms]
  snappy -f webster    (mean ± σ):   79.4 ms ±  1.1 ms  [User:  74.2 ms, System: 5.1 ms]
  gzip -c1 webster     (mean ± σ):  408.4 ms ±  4.7 ms  [User: 405.9 ms, System: 2.4 ms]
  lz4 -c1 webster      (mean ± σ):   93.8 ms ±  2.1 ms  [User:  78.3 ms, System: 15.4 ms]
  zstd -c1 webster     (mean ± σ):  118.7 ms ±  2.3 ms  [User: 119.7 ms, System: 19.7 ms]
  Summary
    snappy webster ran                                      522.299 MiB/s
      1.05 ± 0.02 times faster than snappy -f webster       497.960 MiB/s
      1.24 ± 0.03 times faster than lz4 -c1 webster         421.514 MiB/s
      1.57 ± 0.04 times faster than zstd -c1 webster        333.092 MiB/s
      5.39 ± 0.10 times faster than gzip -c1 webster         96.812 MiB/s

  snappy -d webster.sn (mean ± σ):   67.8 ms ±  1.1 ms  [User:  50.1 ms, System: 17.7 ms]
  snappy -d webster.sz (mean ± σ):   57.2 ms ±  1.0 ms  [User:  54.1 ms, System: 3.0 ms]
  gzip -dc webster.gz  (mean ± σ):  180.9 ms ±  1.7 ms  [User: 178.1 ms, System: 2.7 ms]
  lz4 -dc webster.lz4  (mean ± σ):   25.3 ms ±  0.5 ms  [User:  21.7 ms, System: 3.5 ms]
  zstd -dc webster.zst (mean ± σ):   34.2 ms ±  0.3 ms  [User:  32.9 ms, System: 4.1 ms]
  Summary
    lz4 -dc webster.lz4 ran                                1562.770 MiB/s
      1.35 ± 0.03 times faster than zstd -dc webster.zst   1156.084 MiB/s
      2.26 ± 0.06 times faster than snappy -d webster.sz    691.225 MiB/s
      2.68 ± 0.07 times faster than snappy -d webster.sn    583.157 MiB/s
      7.16 ± 0.16 times faster than gzip -dc webster.gz     218.563 MiB/s


Speed testing on tmpfs on the Cortex-A72 half of sid@2024-01-07/MT8173/LPDDR3-1866:
  zstd -c1 100M ran                                       513.083 MiB/s   194.9 ms
    1.92 ± 0.11 times faster than snappy 100M             267.809 MiB/s   373.4 ms
    1.96 ± 0.14 times faster than snappy -f 100M          261.985 MiB/s   381.7 ms
    2.50 ± 0.13 times faster than lz4 -c1 100M            205.212 MiB/s   487.3 ms
   11.51 ± 0.25 times faster than gzip -c1 100M            44.563 MiB/s  2244   ms

  zstd -dc 100M.zst ran                                   938.967 MiB/s   106.5 ms
    1.88 ± 0.25 times faster than lz4 -dc 100M.lz4        499.001 MiB/s   200.4 ms
    2.92 ± 0.41 times faster than snappy -d 100M.sz       322.061 MiB/s   310.5 ms
    3.08 ± 0.34 times faster than snappy -d 100M.sn       304.692 MiB/s   328.2 ms
    8.84 ± 0.54 times faster than gzip -dc 100M.gz        106.157 MiB/s   942.0 ms

  snappy webster ran                                      146.545 MiB/s   269.8 ms
    1.03 ± 0.13 times faster than snappy -f webster       142.891 MiB/s   276.7 ms
    1.25 ± 0.14 times faster than lz4 -c1 webster         117.672 MiB/s   336.0 ms
    1.77 ± 0.17 times faster than zstd -c1 webster         82.750 MiB/s   477.8 ms
    5.06 ± 0.49 times faster than gzip -c1 webster         28.965 MiB/s  1365   ms

  lz4 -dc webster.lz4 ran                                 325.416 MiB/s   121.5 ms
    1.44 ± 0.14 times faster than zstd -dc webster.zst    226.579 MiB/s   174.5 ms
    1.90 ± 0.24 times faster than snappy -d webster.sz    171.383 MiB/s   230.7 ms
    2.01 ± 0.26 times faster than snappy -d webster.sn    161.842 MiB/s   244.3 ms
    4.59 ± 0.45 times faster than gzip -dc webster.gz      70.945 MiB/s   557.3 ms

Unabridged measurements at https://man.sr.ht/~nabijaczleweli/snappy-tools/measurements/2024-02-13-1.md


Release tarballs are signed with nabijaczleweli@nabijaczleweli.xyz
  (pull with WKD, but 7D69 474E 8402 8C5C C0C4  4163 BCFD 0B01 8D26 58F1).
аnd stored in git notes, as-if via the example program provided at
  https://man.sr.ht/git.sr.ht/#signing-tagsx27-tarballs
and are thus available on the refs listing/tag page as .tar.gz.asc.