Subj : docs/zmodem_comparison.md To : Git commit to main/sbbs/master From : Rob Swindell (on Debian Linux) Date : Sun Aug 30 2026 03:07:35 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. --- SBBSecho 3.37-Linux * Origin: Vertrauen - [vert/cvs/bbs].synchro.net (1:103/705) .