Linux 壓縮算法大比試
阿恆
Linux 上有很多壓縮算法,最廣為人知的是 compress、gzip、bzip2 等等,它們有多好?壓縮率最高是哪一個?壓縮速度最快的是誰?解壓夠快嗎?今天我們找來幾個來進行比試。
參賽名單
我們的參賽者包括:
lzop (https://www.lzop.org/)
bzip2 (https://sourceware.org/bzip2/)
以上列出的網址只供參考,要安裝的話只需要使用 apt 或者 yum 等便可以,非常簡單。
純文字檔案壓縮比試
測試設定
我隨機從 Linux 系統的英語字典 /usr/share/dict/american-english
中抽取英文字,每個一行,湊合成一個大約 32 MB 的檔案。製作這個檔案只需幾行 Python 程式,比較簡單,缺點是不夠真實,例如常用字 is
、are
、he
、she
、it
之類,出現的機率遠遠低於真實的情況,相反冷僻字的機率卻比真實情況高。但是找一份 32 MB 的純文字檔案並不容易,把很多份文字檔案結合起來湊整一個這麼大的檔案,又很花時間和功夫,所以我採用了現在的方法。
每一個壓縮算法都會使用最大壓縮率(通常較慢)和最小壓縮率(通常較快)進行測試,每次測試進行三次然後去平均值,採用 Linux 的 time 指令來計時,例如
|
|
原始測試結果
以下是壓縮率和所花時間的原始數據:
壓縮工具 | 壓縮率 | 壓縮時間 (sec) | 解壓時間 (sec) |
---|---|---|---|
bzip2 -1 | 0.43 | 25.945 | 11.989 |
bzip2 -9 | 0.35 | 29.879 | 13.307 |
gzip -1 | 0.53 | 6.119 | 2.551 |
gzip -9 | 0.47 | 36.153 | 2.194 |
lz4 -1 | 0.82 | 0.902 | 0.226 |
lz4 -12 | 0.54 | 30.489 | 0.252 |
lzop -1 | 0.77 | 1.257 | 0.903 |
lzop -9 | 0.55 | 69.256 | 1.027 |
xz -0 | 0.49 | 33.879 | 9.047 |
xz -9 | 0.30 | 478.419 | 4.667 |
zstd -1 | 0.51 | 1.926 | 0.418 |
zstd -19 | 0.30 | 359.589 | 0.681 |
評語
壓縮率最高的是 zstd -19
和 xz -9
,但是他們所花的時間也很可觀,如果不介意犧牲一點兒壓縮率的話,bzip2 -9
是第二佳選擇,不過速度則提升了十倍以上。
速度最快的是 lz4 -1
,不用一秒便壓縮完 32 MB 的檔案,lzop -1
和 zstd -1
也不差,所花的時間不超過兩秒,三者之中 zstd -1
的壓縮率顯然比較優勝,追求速度的話這是比較好的選擇。
解壓方面,我們只需要考慮速度,最快的是 lz4
,它以驚人的不足五分之一秒解壓 32MB 的壓縮檔案,可惜 lz4
的壓縮率不算高,如果只考慮壓縮率最高的 zstd
、xz
和 bzip2
,解壓最快的是 zstd
,其次是 xz
,最慢的是 bzip2
,bzip2
同時也是所有參賽者中解壓最慢的。
二進位檔案壓縮比試
測試設定
我在 /bin
找一個最大的執行檔來測試:
|
|
這個檔案大約 10MB,然後用相同的測試程序,那就是每一個壓縮算法都會使用最大和最小壓縮率進行測試,每次測試進行三次然後去平均值,採用 Linux 的 time 指令來計時。
原始測試結果
以下是壓縮率和所花時間的原始數據:
壓縮工具 | 壓縮率 | 壓縮時間 (sec) | 解壓時間 (sec) |
---|---|---|---|
bzip2 -1 | 0.42 | 2.156 | 0.845 |
bzip2 -9 | 0.41 | 2.361 | 1.102 |
gzip -1 | 0.47 | 0.521 | 0.190 |
gzip -9 | 0.44 | 1.311 | 0.161 |
lz4 -1 | 0.62 | 0.060 | 0.016 |
lz4 -12 | 0.51 | 4.697 | 0.016 |
lzop -1 | 0.60 | 0.079 | 0.057 |
lzop -9 | 0.48 | 6.884 | 0.069 |
xz -0 | 0.39 | 2.029 | 0.649 |
xz -9 | 0.34 | 11.381 | 0.594 |
zstd -1 | 0.50 | 0.137 | 0.061 |
zstd -19 | 0.37 | 9.796 | 0.068 |
評語
壓縮率最高的是 xz -9
,zstd -19
則緊隨其後,令人驚訝的是第三位竟然的 xz -0
,這個 xz
工具的最低壓縮率設定,打敗了很多其他工具的最大壓縮率。這三者的壓縮速度同樣是按這個次序排列,即是說 xz -9
最慢,xz -0
最快。
速度最快的是 lz4 -1
和 lzop -1
,不足十分之一秒便壓縮完 10 MB 的二進位檔案,zstd -1
也不差,所花的時間不超過五分之一秒,三者之中 zstd -1
的壓縮率顯然比較優勝,追求速度的話這是比較好的選擇。
解壓方面,我們只需要考慮速度,最快的是 lz4
,它以驚人的不足十六分之一秒完成解壓,可惜 lz4
的壓縮率不算高,如果只考慮壓縮率最高的 xz
和 zstd
,zstd
以比對手快十倍的速度勝出。
總結
純文字檔案來說,zstd -9
和 xz -9
的壓縮率最高,但速度比第三位的 bzip -9
慢得多,bzip -9
可說是速度與壓縮率之間取得一個不錯的平衡。
二進位檔案來說,xz -9
的壓縮率最高,但若果要取得速度與壓縮率的平衡,xz -0
是比較好的選擇。