這個儲存庫的 python/ 目錄,單一 snapshot
ANLA 1.0 只儲存,不壓縮。所以單一 snapshot 會比原樹更大,兩種壓縮器都贏它。這一列就是「該做 Zstandard」這個主張,寫成一次量測。
34% 為輸入的 2.29 MiB
五個情境,跑在這個儲存庫自己的 git 歷史上,並且跟一般人真的會拿來用的替代方案對比。每一個數字都由 bench/run_bench.py 產生並寫進一份 JSON,這個頁面是從那份 JSON 生成的——所以頁面說不出任何量測程式沒有量到的東西,包含 ANLA 輸掉的那幾列。
ANLA 1.0 只儲存,不壓縮。所以單一 snapshot 會比原樹更大,兩種壓縮器都贏它。這一列就是「該做 Zstandard」這個主張,寫成一次量測。
34% 為輸入的 2.29 MiB
Milestone 2 不會移動任何一個壓縮數字,因為它本來就不是在談壓縮——它是「讓工具能打包以前直接拒絕的樹」。這就是它在 manifest 裡、每個物件的帳單。
4280% 為輸入的 7.7 KiB
每一個版本都逐位元可還原。對照組是「每個版本各存一個 ZIP」——沒有 snapshot 的人就是這樣做的——以及「全部版本一個 tar.gz」。gzip 的視窗只有 32 KB,看不到從這一份原始碼樹到下一份,這正是為什麼去重是另一套機制,而不是比較差的壓縮。
9% 為輸入的 4.42 MiB
新內容,對比「描述它」的代價。manifest 描述的是它整個 snapshot 而不是差異,這一欄就是那個決定的價格。
| 第幾個 | 新內容 | 描述資料 |
|---|---|---|
| 1 | 173.7 KiB | 17.8 KiB |
| 2 | 7.7 KiB | 18.6 KiB |
| 3 | 4.5 KiB | 18.9 KiB |
| 4 | 8.6 KiB | 19.3 KiB |
| 5 | 6.2 KiB | 19.3 KiB |
| 6 | 24.2 KiB | 21.4 KiB |
| 7 | 3.6 KiB | 21.4 KiB |
| 8 | 3.9 KiB | 21.4 KiB |
去重的上限。第 2 到第 5 個 snapshot 只多了一份 manifest 跟一個 footer,所以它們的成本就是 snapshot 設計裡第一個決定的價格:manifest 描述的是它整個 snapshot,而不是差異。
23% 為輸入的 557.4 KiB
新內容,對比「描述它」的代價。manifest 描述的是它整個 snapshot 而不是差異,這一欄就是那個決定的價格。
| 第幾個 | 新內容 | 描述資料 |
|---|---|---|
| 1 | 112.2 KiB | 3.0 KiB |
| 2 | 0.0 KiB | 3.1 KiB |
| 3 | 0.0 KiB | 3.1 KiB |
| 4 | 0.0 KiB | 3.1 KiB |
| 5 | 0.0 KiB | 3.1 KiB |
這種資料沒有東西壓得動,也不該壓得動。第一個 snapshot 比原檔略大;第二個幾乎不用錢——去重不在乎位元組壓不壓得動。
50% 為輸入的 3.81 MiB
新內容,對比「描述它」的代價。manifest 描述的是它整個 snapshot 而不是差異,這一欄就是那個決定的價格。
| 第幾個 | 新內容 | 描述資料 |
|---|---|---|
| 1 | 1.91 MiB | 3.1 KiB |
| 2 | 0.0 KiB | 3.1 KiB |
固定切塊撐不過的情境:每一個邊界都位移了,所以沒有任何一個 chunk 對得上,整個檔案被存第二次。內容定義的邊界跟著內容走,所以只有真正改變的 chunk 是新的。
55% 為輸入的 5.72 MiB
新內容,對比「描述它」的代價。manifest 描述的是它整個 snapshot 而不是差異,這一欄就是那個決定的價格。
| 第幾個 | 新內容 | 描述資料 |
|---|---|---|
| 1 | 2.86 MiB | 3.7 KiB |
| 2 | 277.0 KiB | 3.8 KiB |
每秒多少 MiB,在跑這次量測的機器上。內容定義切塊是預設值——因為固定切塊會讓去重整個垮掉——而在 Python writer 裡它同時也是慢路徑,慢兩個數量級。Rust writer 做的是完全一樣的工作,產生逐位元相同的封裝,速度是 28 倍;所以這是實作的數字,不是格式的數字。會publish 出來,是因為一個只量自己擅長的項目的專案,等於沒有在量。
自己重跑一次:
python bench/run_bench.py —
原始碼採私人存取