Repository navigation
ACEAPEX 2.4.0
ACEAPEX 2.4.0 — 2026-10-28
The FAST profile: the ACEPX2 container without an entropy stage. Independent 1 MiB blocks, a fixed-width token
stream, one decoder that is safe by construction, the same archive for the C++ library, the C99 decoder and the
Python package. Default-profile archives are unchanged byte for byte. Specification: docs/FORMAT_FAST.md.
What changed
- Header version 3 under the same magic;
profileandmin_matchin the header;u64block table; blocks of
u32tokens (literal length 6 bits, match code 6 bits, distance 20 bits), extensions, literals, a 64-byte pad. - Levels 11..18 (
--profile fast --level 1..8): minimum match 16 / 12 / 8 / 5, greedy-lazy parse; 15..18 the same
with an optimal parse. The minimum match is the level's one knob and it is read from the header. - One decoder: exact-size buffers, the fast path only while a token fits in the output and the literal read lands in
the pad; no second "unsafe" decoder.scripts/fast_fuzz.cpp(ASan/UBSan) inmake testwith a negative control. - Readers:
aceapex_decompress[_mt],_region,_ranges,_stream, the CLI (c,d,d --out -, pipes,r,
faidx),axdec,libaceapex_decode.so,pip install aceapex. Not in 2.4.0: GPU (E_HEADER),
aceapex_decode_streams(ACEAPEX_ERR_DATA). - Five new conformance fixtures (
verify/fixtures/conf/*_fast_*), six new claims (scripts/fast_test.sh).
Numbers (ace-core: AMD EPYC 4344P, 8 cores / 16 threads; scripts/fast_bench.sh)
aceapex t --level L --threads T: encode on T threads, then 7 decodes of the in-memory archive, median; every run
compared with the input. Tables: results/fast-bench-2026-10-27-9f8a4ab.md (levels 11 and 12: b000c99 gives these
levels the decoder variant of 9f8a4ab) and results/fast-bench-2026-10-27-0d3a065.md (levels 13-15).
| corpus | level | min match | ratio (%) | encode MB/s (8 T) | decode 1 thread MB/s | decode 8 threads MB/s |
|---|---|---|---|---|---|---|
| silesia.tar | 11 | 16 | 61.35 | 176.09 | 10877.14 | 16644.56 |
| silesia.tar | 12 | 12 | 54.13 | 167.14 | 9777.05 | 17080.82 |
| silesia.tar | 13 | 8 | 44.95 | 164.16 | 8802.73 | 17382.81 |
| silesia.tar | 14 | 5 | 40.68 | 169.84 | 7125.30 | 17558.03 |
| silesia.tar | 15 | 16 (optimal) | 55.36 | 8.02 | 10285.72 | 16746.69 |
| chr1.fa | 11 | 16 | 91.44 | 1269.25 | 12756.01 | 18536.63 |
| enwik9 | 11 | 16 | 78.76 | 296.00 | 10617.25 | 15375.65 |
lzbench, the published single-thread method (-t8,8 -o1c4, one pinned core, median of 7 runs, same binary): a clean
lzbench 2cc81a8 after scripts/lzbench_sync.sh (no manual edits), codec aceapex_fast levels 1 / 2 = levels 11 / 12,
started at load average 0.08 / 0.60 / 0.88 (results/fast3-lzbench-2026-10-28.log):
| codec | ratio | decompress MB/s | compress MB/s |
|---|---|---|---|
| aceapex -11 | 61.35 % | 10 956 | 25.9 |
| aceapex -12 | 54.13 % | 9 840 | 24.5 |
| zxc 0.15.0 -1 | 61.67 % | 10 636 | 1 016 |
| misa77 0.6.0 -1 | 42.64 % | 9 604 | 121 |
Research numbers of the same layout before the release, same host and method (research/fastblk/d1-lzbench-2026-10-26.md,
research/fastblk/d1b-lzbench-2026-10-27.log): min match 16 at 61.34 % decoded 11 523 MB/s (unsafe decoder) / 10 535 (research safe
decoder) against zxc -1 at 61.67 % and 10 634 MB/s. The release decoder (safe by construction) lands at 10 956 MB/s:
4.9 % below the research unsafe decoder, 4.0 % above the research safe one, 3.0 % above zxc -1 in the same binary.
Where it loses
- Ratio: silesia at min match 16 is 61 % of the input; the default profile is 32.6 %. Genomes: no DNA transform.
- Encoder: 25-28 MB/s on one core at levels 11-14, ~1 MB/s at 15-18 (TurboBench's rank weighs compression speed).
- GPU: not in 2.4.0.
Check it
make test (claims head_fast_*), bash scripts/fast_test.sh, bash scripts/fast_bench.sh. Fixtures and
their inputs: scripts/make_fixtures.py --regen --only text_fast_200K,rand_fast_70K,zeros_fast_1500K,dna_fast_opt_2MiB,rand_fast_7B.
Binary
aceapex-2.4.0-linux-x86_64.tar.gz (static, x86-64-v2, zstd 1.5.7; scripts/package_linux.sh). Built on bd3e2c4 (VERSION inside the tarball): between it and the tag only logs, text (README, docs moved by #5) and two GPU measurement scripts from #6 (scripts/gpu_hash_ab.cu, scripts/colab_hash_ab.sh, not part of the CLI) changed; the sources of the binary are the same.
f2e6810612dd6dcc4e0f185cf8590811149dcd1423786ad1ca240c180e7eb577 aceapex-2.4.0-linux-x86_64.tar.gz
b9e88f1340a5cf17bdaaeeb7a37d6a5a4767ef9a6482c2ef0fa43b273f1e557d aceapex (binary inside the tarball)