Skip to content

v0.48.0 — the entropy coder, and a grid we stopped reallocating

Choose a tag to compare

@tannevaled tannevaled released this 26 Sep 20:58
· 45 commits to main since this release
0e5d71b

Faster on scanned pages, byte-identical output

Takes go-images/jpeg2000 v0.8.0 and v0.7.0's own predecessor work forward.

§24 of the conformance baseline named ia-biodiversity as the one population where
a typical page ties with poppler — median 1.004×, slower on 128 of 250. Its
worst page turned out not to be limited by the wavelet at all but by EBCOT
entropy decoding
, and inside that, by computing the coding context from eight
neighbours rather than by the arithmetic decoder it feeds.

document before after
jahresberichtder710meye.pdf 801.7 ms 773.5 ms −3.5%
bulletin43peab.pdf 663.9 ms 636.4 ms −4.1%
b31820797.pdf (wavelet-heavy) +0.5%, noise

Also in this release, from v0.47.0's tail: mask() no longer allocates a coverage
grid for every mark made through a clip. That is −39% of all allocation on the
corpus's worst page (2 268 → 1 379 MB) and −4% to −8% on ordinary pages, with no
measurable change in time
— stated plainly because it is what the measurement
said.

All 3 215 corpus documents render byte-identical to v0.47.0.