https://gitlab.synchro.net/main/sbbs/-/commit/218c474f6d616d63799bdac5
Modified Files:
docs/zmodem_comparison.md
Log Message:
docs/zmodem: re-measure everything against the current releases
The document had accumulated five measuring sessions between 2026-07-23
and 2026-08-25, comparing components at versions that no longer ship and carrying figures taken against a baseline now known to have been the bottleneck. Re-measure the whole thing in one sitting on one host and
rewrite around it.
Structural change: measure the full 20-pair sender x receiver matrix
rather than holding one end fixed. Fixing an end is what produced the
old sender table's four-way tie -- every row was scored against lrz,
which receives for more CPU than any sender in the table spends to send,
so 1.74x of real difference reported as 1.8%. The matrix has no such
blind spot, and printing both endpoints' CPU makes the bottleneck visible
in every cell.
All twenty pairs interoperate byte-identically and wire overhead is equal
to two decimals at equal block size, so nothing here is a compatibility problem. zmtx/zmrx 2.04 is the cheapest implementation in both
directions by roughly a factor of two -- 10.0 instructions per data byte sending and 12.1 receiving, against the next best of 23.5 either way.
sexyz's receiver is second at 24.6, where the same code cost 126.8 eight
days earlier, and its error recovery is the strongest measured: 10 of 10
in both directions where the all-lrzsz pair manages 7 of 10.
Two findings belong to zmtx/zmrx rather than to us. Its whole-file retry budget resets only on the ZRPOS path, so NAK- and timeout-driven recovery
still drains it and the sender cannot complete a transfer at or above a
5e-7 error rate. And its ESCCTL escaping omits carriage return, so no
receiver that requests escaping can download from it -- the same defect
our own send path carried until 2026-08-24.
New sections cover what the old document never measured: feature and
option support side by side, ESCCTL interoperability, and per-endpoint instruction counts for all eight endpoints.
Method notes that cost real time to learn are written down. The
corruption model seeds its PRNG with a constant, so repeated runs at one
rate are not independent samples and a low enough rate injects nothing at
all -- a rate sweep is the instrument, not repetition. Error gates are
far more load-sensitive than throughput runs: a first pass taken while a profiler was still finishing scored the same lrzsz pair 0/3 and 2/3 in
two identical invocations, where it passes in half a second on an idle
host. And the first cut of this measurement used a zmtx checkout 32
commits stale, which is why every version in section 1.1 now carries its release date.
---
■ Synchronet ■ Vertrauen ■ Home of Synchronet ■ [vert/cvs/bbs].synchro.net