ZSTD 1.4.9でLong Modeが速くなったらしいので少し試す

ZSTD 1.4.9がリリースされていました．

Zstd 1.4.9 Released With ~2x Faster Performance For Long Mode – Phoronix

Release Zstandard v1.4.9 · facebook/zstd

Zstandard – Real-time data compression algorithm

今回 --long 利用時に最大2倍の高速化が売りのようです．それはすごいってことで少し試してみました．

>2x Faster Long Distance Mode
Long Distance Mode (LDM) --long just got a whole lot faster thanks to optimizations by @mpu in #2483! These optimizations preserve the compression ratio but drastically speed up compression. It is especially noticeable in multithreaded mode, because the long distance match finder is not parallelized.

現在のzstdのバージョンは1つ前の1.4.8でした．

$ zstd -V
*** zstd command line interface 64-bits v1.4.8, by Yann Collet ***

1.4.9をsourceからbuildします．

$ sudo apt build-dep zstd (1)
$ git clone https://github.com/facebook/zstd (2)
$ cd zstd
$ git checkout v1.4.9 (3)
$ make (4)
$ ./zstd -V (5)
*** zstd command line interface 64-bits v1.4.9, by Yann Collet ***

zstdビルドに必要なパッケージの導入

sourceのclone

1.4.9に切り替え

make

バージョン確認

ZSTD(1)

• --long[=#]: enables long distance matching with # windowLog, if not # is not present it defaults to 27. This increases the window
size (windowLog) and memory usage for both the compressor and decompressor. This setting is designed to improve the compression
ratio for files with long matches at a large distance.

Note: If windowLog is set to larger than 27, --long=windowLog or --memory=windowSize needs to be passed to the decompressor.

--long は 31までのようです．32を指定するとこういうエラーになります．

zstd: error 11 : Parameter is out of bound

ちょうど大きめのtarがあったのでこれで試します．

$ ls -l ../linux-5.11.tar
-rw-r--r-- 1 matoken matoken 1064212480 Feb 15 18:18 ../linux-5.11.tar

$ grep -m1 ^"model name" /proc/cpuinfo (1)
model name : Intel(R) Core(TM) i5-3320M CPU @ 2.60GHz
$ nproc (2)
4
$ /bin/time -f"\treal\t%e" zstd -q -T`nproc` -1 --long=31 ../linux-5.11.tar -o /dev/null (3)
real 8.10
$ /bin/time -f"\treal\t%e" ./zstd -q -T`nproc` -1 --long=31 ../linux-5.11.tar -o /dev/null (4)
real 5.27
$ /bin/time -f"\treal\t%e" zstd -q -T`nproc` --long=31 ../linux-5.11.tar -o /dev/null (5)
real 8.36
$ /bin/time -f"\treal\t%e" ./zstd -q -T`nproc` --long=31 ../linux-5.11.tar -o /dev/null (6)
real 5.76
$ /bin/time -f"\treal\t%e" zstd -q -T`nproc` -19 --long=31 ../linux-5.11.tar -o /dev/null (7)
real 388.15
$ /bin/time -f"\treal\t%e" ./zstd -q -T`nproc` -19 --long=31 ../linux-5.11.tar -o /dev/null (8)
real 318.08
$ /bin/time -f"\treal\t%e" zstd -q -T1 --long=31 ../linux-5.11.tar -o /dev/null (9)
real 11.81
$ /bin/time -f"\treal\t%e" ./zstd -q -T1 --long=31 ../linux-5.11.tar -o /dev/null (10)
real 7.89

CPUは Intel® Core i5-3320M CPU @ 2.60GHz

プロセッサ数

圧縮レベル1(最低)の1.4.8で8.10s

圧縮レベル1(最低)の1.4.9で5.27s

圧縮レベル3(デフォルト)の1.4.8で8.36s

圧縮レベル3(デフォルト)の1.4.9で5.76s

圧縮レベル19(最高)の1.4.8で388.15s

圧縮レベル19(最高)の1.4.9で318.08s

スレッド数を1にしたときの圧縮レベル3(デフォルト)の1.4.8で11.81s

スレッド数を1にしたときの圧縮レベル3(デフォルト)の1.4.8で7.89s

2倍とまでは行きませんが速くなっているようです :)
マルチスレッドで聞きそうなことが書かれていますが，スレッド数を1にしてもあまり割合変わらない?

この環境はよくサーマルスロットリングしているので参考程度に……．

環境

$ ./zstd -V
*** zstd command line interface 64-bits v1.4.9, by Yann Collet ***
$ zstd -V
*** zstd command line interface 64-bits v1.4.8, by Yann Collet ***
$ dpkg-query -W zstd
zstd 1.4.8+dfsg-2.1
$ lsb_release -dr
Description: Debian GNU/Linux bullseye/sid
Release: unstable
$ uname -m
x86_64