# 有限进程级基准（Commit 15）

2026-11-09 实际完成五类场景、两种规模的 Linux Native 对比。全部样本保留：120次预热、420次正式操作测量（10×3操作×2实现×7）；540次均校验成功。基准轮次不计入库测试。本文数字由本次 `summary.json` 直接生成，没有选取最好样本或删除较差场景。

## 环境、构建和原始证据

实测为 Ubuntu 24.04 / WSL2，Linux 6.6.87.2-microsoft-standard-WSL2 x86_64；AMD Ryzen 9 8940HX with Radeon Graphics，来宾可见16逻辑CPU，内存10427232256字节（不是宿主机物理内存报告）。数据、两个实际执行文件和每轮输出均位于 `/tmp/moonlibsync-benchmark-vaq20ret/`，findmnt确认 `/dev/sdd` 的ext4根挂载；不是DrvFS正向运行。产物在工程 `_build/benchmarks/20261109T023316927733Z/`。ext4也可能受WSL虚拟盘和宿主机负载影响。

固定moonc v0.10.20+65efd5b93、moon/moonrun0.1.20261104，mooncrypt0.4.5闭包已核验。C编译器为Ubuntu GCC13.3.0；参考CMake3.28.4。先实际读取当前 `moon build --help` 和 `rdiff --help`；正式CLI用新目标目录构建 `moon --target-dir RUN/build build cmd/moonlibsync --target native --release`。真实产物 `RUN/build/native/release/build/cmd/moonlibsync/moonlibsync.exe`，ELF魔数及哈希核对，未复用debug产物。

rdiff从固定librsync v2.3.4 / e364852674780e43d578e4239128ff7014190ed3重新构建，核对源码、无内容差异/额外文件、版本与CMakeCache：Release、BUILD_SHARED_LIBS=OFF、BUILD_RDIFF=ON、USE_LIBB2=OFF、ENABLE_COMPRESSION=OFF、ENABLE_TRACE=OFF。实际C编译命令及完整cache保存在manifest。两端ELF复制到同一ext4临时目录执行，复制后SHA-256与原始可执行文件一致。

| 可执行文件 | SHA-256 |
| --- | --- |
| MoonLibSync release | `31f73c182726b8053490c370d8dc98c7bd1e9a41be6bbdcd672822b9b2481a03` |
| rdiff Release | `3459c9206603a364a6e4b55924c3fba5a87016c10de6b76f18528f6641c2f81c` |

常规Linux源码复现（先按README选择固定工具链并安装参考构建依赖）：

```bash
set -euo pipefail
bash scripts/build-reference.sh
python3 scripts/benchmark.py --self-check
python3 scripts/benchmark.py
```

本机WSL实际选择 `.toolchain/linux`，PATH先加入其bin、`.toolchain/reference/cmake-wheel/cmake/data/bin`、`/usr/bin:/bin`，设置 `MOONLIBSYNC_OFFLINE_INDEX=1`；执行 `bash scripts/build-reference.sh` 后运行 `python3 scripts/benchmark.py`。该离线标志只适用于本机已有核验缓存，不是干净环境跳过依赖安装的指令。脚本固定输出新时间戳目录，主基准没有可任意调整的轮数/样本筛选参数。`MOONLIBSYNC_BENCH_TMP_PARENT` 可指定临时父目录，但完整测量仍强制确认ext4，不会降低CLI提交保证。

`manifest.json` 记录源码SHA/dirty、完整计划与其哈希、驱动哈希、20个被测运行库/CLI/构建配置/锁文件哈希、输入长度与SHA-256、实际执行路径、环境及版本；`measurements.json` 保存所有原始ns耗时、阶段、轮次、顺序、退出码、逐轮输入/输出哈希与验证状态；`commands.log` 包含构建、准备、计时和非计时校验的真实命令/退出码；`summary.json` 为统计。`cases/` 留存本次独立old/new、同一标准签名及两端delta；每轮输出在校验并记录哈希后才删除，发生异常会归档工作文件并标为failed，而非丢弃样本。

本次测量HEAD为925d47979549da4e8e3c32b742806513478346e6，**dirty=true**（新增基准工具/配置，后续文档尚未提交）；不冒充最终干净同SHA测量。被测20文件哈希冻结于 `tests/benchmarks/runtime-baseline.json`，提交后运行 `python scripts/benchmark.py --verify-source RUN_DIRECTORY` 逐文件比较最终源码，并保存source-linkage.json及最终冻结SHA/dirty。驱动和计划也必须一致。功能/依赖/构建变更不能沿用此关联，须重新测量；本文不填写尚不存在的自身提交SHA。

## 固定输入与测量方法

计划原文在 `tests/benchmarks/config.json`，在执行前固定：规模65536与1048576字节；场景按相同、小替换、前插、全异、重复的顺序。没有按结果选样。独立输入由Python标准库SHAKE256生成，不以恢复输出定义new，也不使用平台PRNG：domain为ASCII `MoonLibSync benchmark v1/` + 十进制size + `/old`，取size字节后逐字节AND127为old。全异new使用同前缀+十进制size+`/different`的SHAKE256，AND127后OR128；与old字节集合不相交，且本次实际delta两端COPY均为0。

小替换在 `size//2+17` 替换64字节为80..bf，不改长度；前插在0插入32字节80..9f；重复场景old为00..7f的128字节周期，截至size，在size//2插入32字节80..9f。相同场景new=old。旧文件长度均按名义规模，新文件在前插/重复场景增加32字节。主签名参数固定2048/32，不扩展参数矩阵。515字节功能示例另保留，不参与该基准。

每组2轮预热、7轮正式；循环为case→round→signature/delta/patch→两个实现，先后由(case_index+round_index+operation_index)%2交替。全部原始轮次记录，使用 `perf_counter_ns` 单调高分辨率时钟。每次用新输出路径，两个实现共享同一文件系统；不覆盖既有输出。

signature使用相同old、显式相同参数，逐轮完整签名字节一致。delta两端使用**同一rdiff标准签名文件**与new，严格解析实际delta并逐指令核对独立new；每轮delta再交给另一实现实际patch，逐字节比较恢复。重复运行同一实现的delta还必须与其准备期产物完全一致。patch两端都使用**同一rdiff delta**和相同old，逐轮逐字节比较new，不拿各自不同布局的delta直接当成相同patch工作。

每次计时从subprocess调用前到其返回后，包括子进程启动、文件读、本次计算、输出写和退出；不含输入生成、编译、参考准备、解析/哈希及恢复比较。MoonLibSync还包含文件sync和无覆盖提交，rdiff文件保证不同；这是进程级文件流程成本，**不是纯算法速度或相同内核语义的公平耗时比较**。不关闭安全提交或提高预算。每轮delta后的交叉恢复虽不计时，也会影响后续缓存；全部顺序固定，2轮预热不等于冷盘测量。没有清缓存、绑核、控制宿主机负载或测峰值内存。

## 数据量与实际复用

单位为字节；COPY来自本次实际delta的严格解析。两端COPY字节数本次相同，delta大小仍分列。组合比例 `(signature+delta)/new` 指本次单文件签名交换与增量总字节，不含网络协议、整文件身份元数据等开销，不是实测网络带宽节省。零分母时脚本使用null（不适用）。

| old规模/场景 | old | new | signature | Moon delta | rdiff delta | 两端COPY字节 | 两端COPY条数 | Moon delta/new | Moon (sig+delta)/new |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| 64 KiB/相同 | 65536 | 65536 | 1164 | 11 | 11 | 65536 | 1 | 0.0168% | 1.7929% |
| 64 KiB/小替换 | 65536 | 65536 | 1164 | 2065 | 2065 | 63488 | 2 | 3.1509% | 4.9271% |
| 64 KiB/前插 | 65536 | 65568 | 1164 | 44 | 44 | 65536 | 1 | 0.0671% | 1.8424% |
| 64 KiB/全异 | 65536 | 65536 | 1164 | 65546 | 65545 | 0 | 0 | 100.0153% | 101.7914% |
| 64 KiB/重复 | 65536 | 65568 | 1164 | 166 | 166 | 65536 | 32 | 0.2532% | 2.0284% |
| 1024 KiB/相同 | 1048576 | 1048576 | 18444 | 11 | 11 | 1048576 | 1 | 0.0010% | 1.7600% |
| 1024 KiB/小替换 | 1048576 | 1048576 | 18444 | 2071 | 2071 | 1046528 | 2 | 0.1975% | 1.9565% |
| 1024 KiB/前插 | 1048576 | 1048608 | 18444 | 44 | 44 | 1048576 | 1 | 0.0042% | 1.7631% |
| 1024 KiB/全异 | 1048576 | 1048576 | 18444 | 1048586 | 1048630 | 0 | 0 | 100.0010% | 101.7599% |
| 1024 KiB/重复 | 1048576 | 1048608 | 18444 | 2086 | 2086 | 1048576 | 512 | 0.1989% | 1.9578% |

全异64KiB两端literal条数分别1/2，1MiB为1/17，因此同样零COPY并不要求delta字节或布局完全相同。原始summary还保存各实现literal字节/条数、各自比例和delta哈希。

## 三项操作耗时

全部单位ms；每格为 **中位数 [最小, 最大]**，每格7个正式样本，预热不参与统计。未用不同操作或失败时间填充缺失样本。原始纳秒整数及全部轮次在measurements.json，可重算并与本文核对；没有硬件相关CI速度阈值。

| 规模/场景 | 实现 | signature ms | delta ms | patch ms（共同rdiff delta） |
| --- | --- | ---: | ---: | ---: |
| 64 KiB/相同 | moon | 8.033 [7.366, 8.703] | 8.207 [7.702, 8.695] | 8.175 [7.551, 8.372] |
| 64 KiB/相同 | rdiff | 1.070 [0.838, 1.294] | 0.942 [0.896, 1.175] | 0.892 [0.796, 1.445] |
| 64 KiB/小替换 | moon | 7.885 [6.347, 8.440] | 7.977 [7.072, 8.958] | 8.276 [7.576, 8.683] |
| 64 KiB/小替换 | rdiff | 0.864 [0.786, 1.217] | 1.056 [0.851, 1.439] | 0.975 [0.849, 1.323] |
| 64 KiB/前插 | moon | 7.917 [7.325, 8.418] | 8.466 [7.760, 9.794] | 8.470 [8.022, 9.804] |
| 64 KiB/前插 | rdiff | 0.994 [0.896, 1.305] | 0.956 [0.925, 1.210] | 1.055 [0.930, 1.568] |
| 64 KiB/全异 | moon | 7.911 [7.533, 8.545] | 11.628 [10.817, 12.291] | 8.683 [8.170, 9.634] |
| 64 KiB/全异 | rdiff | 1.007 [0.865, 1.242] | 1.610 [1.462, 1.666] | 1.060 [0.950, 1.263] |
| 64 KiB/重复 | moon | 8.091 [6.798, 10.839] | 8.601 [7.971, 9.685] | 8.762 [8.160, 9.229] |
| 64 KiB/重复 | rdiff | 0.936 [0.859, 1.291] | 1.022 [0.908, 1.596] | 1.048 [0.866, 1.372] |
| 1024 KiB/相同 | moon | 16.298 [15.560, 17.433] | 16.361 [15.555, 17.150] | 14.364 [12.974, 14.968] |
| 1024 KiB/相同 | rdiff | 2.535 [2.349, 2.960] | 2.643 [2.517, 3.157] | 2.043 [1.831, 2.481] |
| 1024 KiB/小替换 | moon | 16.507 [14.826, 18.275] | 16.511 [15.602, 17.681] | 15.357 [13.847, 16.753] |
| 1024 KiB/小替换 | rdiff | 2.464 [2.351, 2.880] | 2.600 [2.452, 2.834] | 2.144 [1.843, 2.399] |
| 1024 KiB/前插 | moon | 16.563 [15.280, 31.231] | 16.717 [16.092, 18.428] | 14.349 [13.236, 15.437] |
| 1024 KiB/前插 | rdiff | 2.594 [2.466, 2.968] | 2.583 [2.532, 3.211] | 1.897 [1.817, 2.159] |
| 1024 KiB/全异 | moon | 15.532 [14.996, 16.503] | 85.494 [81.783, 112.914] | 16.195 [15.210, 18.239] |
| 1024 KiB/全异 | rdiff | 2.680 [2.337, 3.014] | 11.659 [11.360, 12.650] | 2.079 [1.845, 2.444] |
| 1024 KiB/重复 | moon | 16.105 [15.326, 30.744] | 15.909 [15.227, 17.498] | 14.468 [13.671, 16.010] |
| 1024 KiB/重复 | rdiff | 2.473 [2.320, 2.928] | 2.477 [2.359, 3.312] | 2.041 [1.884, 2.421] |

## 结论与适用边界

相同文件两规模均完整COPY，delta只有11字节；但仍须生成/交换1164或18444字节签名，并承担完整扫描和进程/文件成本。小替换只有64个字节改变，实际丢失一个2048字节块的复用，COPY为63488或1046528字节，不能只看修改字节数估计delta。签名生成本身在此机器上也有可见的时间成本。

前插32字节使所有内容整体位移，两规模仍复用全部旧字节，实际delta44字节；它证明本次滚动扫描的位移复用，但不证明所有数据类型均可取得同样收益。

全异场景零COPY，Moon delta分别多10字节，rdiff多9/54字节；加上签名交换，总量超过完整new（Moon约101.79%与101.76%）。1MiB的Moon delta中位85.494ms、rdiff11.659ms，在所测五场景中明显更慢；无候选的扫描仍有成本，不应宣称普遍优势。应用可比较总传输成本并选择全量，delta并不保证更小。

重复内容固定选择早期basis块，两个实现本次均出现32/512条COPY，而相同的非周期文件只有1条；Moon delta大小增加到166/2086字节。每轮实际delta相同，表明本例稳定，不能扩大为最优选择保证。重复候选、指令数量与扫描/强摘要成本共同影响时间，不能把其变化都归于一个因素或用一次观测建立因果模型。

较小文件可能连签名、delta及操作成本都不值得；这里最小规模64KiB，未测更小文件性能。传输字节收益与进程时间收益是不同指标，未测网络，未计算真实业务总成本。Moon在本机这些进程流程中均比rdiff慢，启动/运行时、全缓冲适配和额外文件保证均包含在内；不能用这些数字单独诊断算法或泛化到其他硬件、目标、文件系统、缓存状态或输入分布。

## 原始产物校验

以下为本次原始文件SHA-256；完整产物ZIP及其校验、最终源码关联在提交后交付记录提供。生成二进制和本机路径数据只保留在忽略目录，不提交到仓库。

| 文件 | 字节数 | SHA-256 |
| --- | ---: | --- |
| manifest.json | 94742 | `a48ab2d4faac7a6998d39061bc78adcb67103d862d8d2a3f8a4b75f036b27386` |
| measurements.json | 573031 | `6179de91515926eaf417512ffdc723b75f3361e621299135d139acbbe6093585` |
| commands.log | 307147 | `a26a4a350e7689ba528662e2ef438951b54d101932606ca77937de90e73a06e3` |
| summary.json | 22514 | `0f60deb2180099816355b3f7906eab0d3c6ff434d9ef2f87f9ac1d773f61010e` |

第一轮完整运行 `20261109T022507507896Z` 同样540次全部校验通过，原始产物保留。审查发现Windows初建配置为CRLF、Git提交规范化为LF；因此统一换行后按完全相同计划重新执行全部10组，本文仅报告第二轮 `20261109T023316927733Z`，未按性能结果选择场景或混合样本。两轮配置语义、驱动及20个运行文件相同，最终计划/驱动原始字节与冻结提交另行逐一核对。
