A ANLAAgent-Native Lossless Archive 中文
Measured, not claimed

What ANLA does to real bytes

Five scenarios, run against this repository's own git history and against the alternatives a person would actually reach for. Every figure is produced by bench/run_bench.py and written to a JSON file this page is generated from, so the page cannot say anything the harness did not measure — including the rows where ANLA loses.

▸ Deduplication and compression are different mechanisms. Zstandard landed on 2026-08-07; before it, every figure here was deduplication alone and a single snapshot was larger than the tree it held. The store-only line is kept beside the compressed one in the rows where it used to lose, because a benchmark that quietly drops the case it lost is not reporting, it is marketing.
Measured at 2026-08-15 05:25 UTC · 71a719fProfile: ANLA 1.0 (draft) · codec store, zstd · anla-cdc-1 · blake3-256Python 3.14.5

One snapshot of this repository's python/ directory

This row used to be the argument for Zstandard, stated as a measurement: with only `store` a single snapshot was larger than the tree and both compressors beat it comfortably. The codec landed, so the row now answers its own question — and the `store` line is kept beside it, because a benchmark that quietly drops the case it used to lose is not reporting, it is marketing. **This row's input is the live repository, so its absolute byte counts are not comparable between commits** — adding four test files moved every size on it, including every competitor's. Only the ratios within one run mean anything across time, and a regression small enough to hide inside a few new files would not be visible here at all. The four scenarios with fixed inputs are where a regression would show, and they are exact: on the run that added this note, not one byte moved on any of them.

34% of the input 2.29 MiB

500 files: what namespaced metadata and 500 symlinks add

Milestone 2 moves no compression number, because it is not about compression — it is what lets the tool pack trees it used to refuse outright. This is its actual bill, per object, in the manifest. A symbolic link costs a manifest entry and no chunk at all: it has no content, only a target.

4280% of the input 7.7 KiB

8 successive commits of python/, one snapshot each

Every version is recoverable, byte for byte. The comparison is against keeping each version as its own ZIP, which is what people do without snapshots, and against one tar.gz of all of them — gzip's 32 KB window cannot see from one copy of the tree to the next, which is why deduplication is a different mechanism and not a worse compressor. **This row's input is the live repository, so its absolute byte counts are not comparable between commits** — adding four test files moved every size on it, including every competitor's. Only the ratios within one run mean anything across time, and a regression small enough to hide inside a few new files would not be visible here at all. The four scenarios with fixed inputs are where a regression would show, and they are exact: on the run that added this note, not one byte moved on any of them.

9% of the input 4.42 MiB

Where the bytes went, per snapshot

New content against the cost of describing it. A manifest describes its whole snapshot rather than a delta, and this is what that costs.

SnapshotNew contentMetadata
1173.7 KiB17.8 KiB
27.7 KiB18.6 KiB
34.5 KiB18.9 KiB
48.6 KiB19.3 KiB
56.2 KiB19.3 KiB
624.2 KiB21.4 KiB
73.6 KiB21.4 KiB
83.9 KiB21.4 KiB

The same directory snapshotted 5 times, unchanged

The ceiling. Snapshots 2 to 5 add a manifest and a footer and nothing else, so their cost is the price of decision 1 in the snapshot design: a manifest describes its whole snapshot rather than a delta.

23% of the input 557.4 KiB

Where the bytes went, per snapshot

New content against the cost of describing it. A manifest describes its whole snapshot rather than a delta, and this is what that costs.

SnapshotNew contentMetadata
1112.2 KiB3.0 KiB
20.0 KiB3.1 KiB
30.0 KiB3.1 KiB
40.0 KiB3.1 KiB
50.0 KiB3.1 KiB

2 MB of random bytes, then the identical file again

Nothing compresses this, and nothing should. The first snapshot costs slightly more than the file; the second costs almost nothing, because deduplication does not care whether the bytes are compressible.

50% of the input 3.81 MiB

Where the bytes went, per snapshot

New content against the cost of describing it. A manifest describes its whole snapshot rather than a delta, and this is what that costs.

SnapshotNew contentMetadata
11.91 MiB3.1 KiB
20.0 KiB3.1 KiB

3 MB file, then the same file with 64 bytes inserted at the front

The case fixed-size chunking cannot survive: every boundary moves, so not one chunk matches and the whole file is stored twice. Content-defined boundaries follow the content, so only the chunks that actually changed are new.

55% of the input 5.72 MiB

Where the bytes went, per snapshot

New content against the cost of describing it. A manifest describes its whole snapshot rather than a delta, and this is what that costs.

SnapshotNew contentMetadata
12.86 MiB3.7 KiB
2277.0 KiB3.8 KiB

64 MiB of incompressible data, packed and verified

MiB per second, on the machine that ran this. Content-defined chunking is the default because fixed chunking destroys deduplication — and in the Python writer it is also the slow path, by two orders of magnitude. The Rust writer produces byte-identical archives at 28 times the rate, so this is an implementation number and not a format number. It is published because a project that measures only what it is good at is not measuring.

What the table says to build next

  • One snapshot of a source tree costs 1.1× a tar.gz of the same tree, down from 2.9× before Zstandard landed. It still loses, and for a structural reason rather than a missing feature: tar.gz compresses across file boundaries, and ANLA compresses each chunk on its own so that any chunk can be read without the others.
  • Eight versions of that tree cost 0.30× a single tar.gz of all eight, and 0.64× with the codec turned off. Deduplication is what wins here and compression compounds it. Unlike the tar.gz, any one version extracts on its own and a ninth appends without rewriting a byte.
  • Describing a snapshot cost 17.8 KiB on the first and 21.4 KiB on the eighth, and 71% of everything the later snapshots added. A manifest describes its whole snapshot rather than a delta; FLAG_COMPRESSED_METADATA is what stops that share from growing without bound.
  • Inserting 64 bytes at the front of a 3 MB file costs 280.8 KiB with content-defined boundaries and 2.86 MiB with fixed ones — 10.4× more. That is what anla-cdc-1 is for.

Reproduce this: python bench/run_bench.pySource access is private