# zoo-bench 性能报告

原始数据：`results/zoo-framework-0.7.1b0/20261011T091928Z.json`

## 运行环境

| 项 | 值 |
|---|---|
| CPU 型号 | AMD EPYC 7763 64-Core Processor |
| 逻辑核数 | 4 |
| 平台 | Linux-x86_64 |
| 操作系统 | Linux 6.17.0-1022-azure（#22-Ubuntu SMP Mon Jul 27 17:24:03 UTC 2026） |
| Python | CPython 3.13.16 |
| 解释器 | /opt/hostedtoolcache/Python/3.13.16/x64/bin/python |
| GIL | default |
| 被测框架（发行元数据） | 0.7.1-beta |
| 被测框架（模块 __version__） | 0.7.1-beta（仅附注，不作版本判据） |
| 被测框架的驱动面世代 | 当前代驱动面（调度内核 core + 调度模型 model，完成信号取自结果响应器） |
| harness | zoo-bench 0.0.1 @ 9a42be24ac43f75e2e5d7b16434f91ba3d0717b6 |
| 复现命令 | `zoo-bench run --framework zoo-framework==0.7.1b0` |

> 以 dist_version（发行元数据）为版本真源；module_version 仅作附注

## 负载

- 构成：单位工作 = JSON 序列化 + 反序列化 + 字符串拼接，重复若干次以达到目标耗时；档位由 matrix.yaml 的 body_tiers_us 声明
- **负载是替身，不是真实 trace**：形状接近“取一帧数据 -> 序列化 -> 解析 -> 字符串处理”这类业务动作，但仓库内没有真实样本，结论的适用性以此为前提

## 测量口径

- **执行体耗时在同一次运行内埋点**：由执行体在自身内部测量并回传，框架开销 =端到端 - 它。**不做跨运行减法**——两次运行的状态不同（缓存、频率、调度噪声），相减引入的是系统性偏差。
- **预热不入统计**：每个单元先跑 3 轮预热并丢弃，只统计随后的 30 轮正式采样；采样数等于「正式轮数 x 并发度」。
- **绝对耗时不可跨运行比较**：它只用于看量级；跨版本/跨机器要看的是**同一次运行内的相对量**（开销占比、相对各对照方案的倍数），它们对整体快慢不敏感。

## 结论摘要

- 被测框架 zoo 的执行体时长达到约 2700 微秒 及以上时，其框架开销占端到端的比例降到 15% 以下；短于此档位，选用它的主要代价就是框架开销本身。
- 并发度 1、执行体 40 微秒 下，被测框架比 process_pool 快 1.94x（该并发度所测档位中最快的一档）。
- 并发度 1 下，执行体时长超过约 40 微秒 后，apscheduler 不再快于被测框架。
- 并发度 4 下，执行体时长超过约 40 微秒 后，apscheduler 不再快于被测框架。
- 并发度 16 下，执行体时长超过约 40 微秒 后，apscheduler 不再快于被测框架。
- 并发度 64 下，执行体时长超过约 40 微秒 后，apscheduler 不再快于被测框架。
- 并发度 1 下，执行体时长超过约 300 微秒 后，asyncio_pool 不再快于被测框架。
- 并发度 4 下，所测档位内 asyncio_pool **始终快于**被测框架——这类档位正是本报告的公开不利数据。
- 并发度 16 下，所测档位内 asyncio_pool **始终快于**被测框架——这类档位正是本报告的公开不利数据。
- 并发度 64 下，执行体时长超过约 10000 微秒 后，asyncio_pool 不再快于被测框架。
- 并发度 1 下，执行体时长超过约 300 微秒 后，bare_thread 不再快于被测框架。
- 并发度 4 下，所测档位内 bare_thread **始终快于**被测框架——这类档位正是本报告的公开不利数据。
- 并发度 16 下，所测档位内 bare_thread **始终快于**被测框架——这类档位正是本报告的公开不利数据。
- 并发度 64 下，所测档位内 bare_thread **始终快于**被测框架——这类档位正是本报告的公开不利数据。
- 并发度 1 下，执行体时长超过约 40 微秒 后，process_pool 不再快于被测框架。
- 并发度 4 下，执行体时长超过约 40 微秒 后，process_pool 不再快于被测框架。
- 并发度 16 下，所测档位内 process_pool **始终快于**被测框架——这类档位正是本报告的公开不利数据。
- 并发度 64 下，所测档位内 process_pool **始终快于**被测框架——这类档位正是本报告的公开不利数据。
- 并发度 1 下，所测档位内 thread_pool **始终快于**被测框架——这类档位正是本报告的公开不利数据。
- 并发度 4 下，所测档位内 thread_pool **始终快于**被测框架——这类档位正是本报告的公开不利数据。
- 并发度 16 下，所测档位内 thread_pool **始终快于**被测框架——这类档位正是本报告的公开不利数据。
- 并发度 64 下，执行体时长超过约 10000 微秒 后，thread_pool 不再快于被测框架。

> 单点加速比没有选型含义；结论以“多大的执行体时长下选哪个方案”表述（同一份框架开销，在 40 微秒 的任务上占 70%，在 10 ms 上只占百分之几）

### 开销阈值交叉点

| 方案 | 并发度 | 阈值 | 首个不高于阈值的档位（微秒） | 所测档位（微秒） | 说明 |
|---|---|---|---|---|---|
| apscheduler | 1 | 15.00% | 2700 | 40, 300, 2700, 10000 | 该档位是所测档位中最小的满足者；真实交叉点落在它与前一档之间 |
| apscheduler | 4 | 15.00% | — | 40, 300, 2700, 10000 | 该并发度超过这次运行所在机器的并行能力：执行体自报的耗时里含超订带来的调度等待，与「墙钟 / 并发度」不是同一件事，相减的结果没有意义（实测出现过负值）。端到端、吞吐与执行体自报值仍然有效，故照旧给出。 |
| apscheduler | 16 | 15.00% | — | 40, 300, 2700, 10000 | 该并发度超过这次运行所在机器的并行能力：执行体自报的耗时里含超订带来的调度等待，与「墙钟 / 并发度」不是同一件事，相减的结果没有意义（实测出现过负值）。端到端、吞吐与执行体自报值仍然有效，故照旧给出。 |
| apscheduler | 64 | 15.00% | — | 40, 300, 2700, 10000 | 该并发度超过这次运行所在机器的并行能力：执行体自报的耗时里含超订带来的调度等待，与「墙钟 / 并发度」不是同一件事，相减的结果没有意义（实测出现过负值）。端到端、吞吐与执行体自报值仍然有效，故照旧给出。 |
| asyncio_pool | 1 | 15.00% | 2700 | 40, 300, 2700, 10000 | 该档位是所测档位中最小的满足者；真实交叉点落在它与前一档之间 |
| asyncio_pool | 4 | 15.00% | — | 40, 300, 2700, 10000 | 该并发度超过这次运行所在机器的并行能力：执行体自报的耗时里含超订带来的调度等待，与「墙钟 / 并发度」不是同一件事，相减的结果没有意义（实测出现过负值）。端到端、吞吐与执行体自报值仍然有效，故照旧给出。 |
| asyncio_pool | 16 | 15.00% | — | 40, 300, 2700, 10000 | 该并发度超过这次运行所在机器的并行能力：执行体自报的耗时里含超订带来的调度等待，与「墙钟 / 并发度」不是同一件事，相减的结果没有意义（实测出现过负值）。端到端、吞吐与执行体自报值仍然有效，故照旧给出。 |
| asyncio_pool | 64 | 15.00% | — | 40, 300, 2700, 10000 | 该并发度超过这次运行所在机器的并行能力：执行体自报的耗时里含超订带来的调度等待，与「墙钟 / 并发度」不是同一件事，相减的结果没有意义（实测出现过负值）。端到端、吞吐与执行体自报值仍然有效，故照旧给出。 |
| bare_thread | 1 | 15.00% | 2700 | 40, 300, 2700, 10000 | 该档位是所测档位中最小的满足者；真实交叉点落在它与前一档之间 |
| bare_thread | 4 | 15.00% | — | 40, 300, 2700, 10000 | 该并发度超过这次运行所在机器的并行能力：执行体自报的耗时里含超订带来的调度等待，与「墙钟 / 并发度」不是同一件事，相减的结果没有意义（实测出现过负值）。端到端、吞吐与执行体自报值仍然有效，故照旧给出。 |
| bare_thread | 16 | 15.00% | — | 40, 300, 2700, 10000 | 该并发度超过这次运行所在机器的并行能力：执行体自报的耗时里含超订带来的调度等待，与「墙钟 / 并发度」不是同一件事，相减的结果没有意义（实测出现过负值）。端到端、吞吐与执行体自报值仍然有效，故照旧给出。 |
| bare_thread | 64 | 15.00% | — | 40, 300, 2700, 10000 | 该并发度超过这次运行所在机器的并行能力：执行体自报的耗时里含超订带来的调度等待，与「墙钟 / 并发度」不是同一件事，相减的结果没有意义（实测出现过负值）。端到端、吞吐与执行体自报值仍然有效，故照旧给出。 |
| process_pool | 1 | 15.00% | 2700 | 40, 300, 2700, 10000 | 该档位是所测档位中最小的满足者；真实交叉点落在它与前一档之间 |
| process_pool | 4 | 15.00% | — | 40, 300, 2700, 10000 | 该并发度超过这次运行所在机器的并行能力：执行体自报的耗时里含超订带来的调度等待，与「墙钟 / 并发度」不是同一件事，相减的结果没有意义（实测出现过负值）。端到端、吞吐与执行体自报值仍然有效，故照旧给出。 |
| process_pool | 16 | 15.00% | — | 40, 300, 2700, 10000 | 该并发度超过这次运行所在机器的并行能力：执行体自报的耗时里含超订带来的调度等待，与「墙钟 / 并发度」不是同一件事，相减的结果没有意义（实测出现过负值）。端到端、吞吐与执行体自报值仍然有效，故照旧给出。 |
| process_pool | 64 | 15.00% | — | 40, 300, 2700, 10000 | 该并发度超过这次运行所在机器的并行能力：执行体自报的耗时里含超订带来的调度等待，与「墙钟 / 并发度」不是同一件事，相减的结果没有意义（实测出现过负值）。端到端、吞吐与执行体自报值仍然有效，故照旧给出。 |
| thread_pool | 1 | 15.00% | 300 | 40, 300, 2700, 10000 | 该档位是所测档位中最小的满足者；真实交叉点落在它与前一档之间 |
| thread_pool | 4 | 15.00% | — | 40, 300, 2700, 10000 | 该并发度超过这次运行所在机器的并行能力：执行体自报的耗时里含超订带来的调度等待，与「墙钟 / 并发度」不是同一件事，相减的结果没有意义（实测出现过负值）。端到端、吞吐与执行体自报值仍然有效，故照旧给出。 |
| thread_pool | 16 | 15.00% | — | 40, 300, 2700, 10000 | 该并发度超过这次运行所在机器的并行能力：执行体自报的耗时里含超订带来的调度等待，与「墙钟 / 并发度」不是同一件事，相减的结果没有意义（实测出现过负值）。端到端、吞吐与执行体自报值仍然有效，故照旧给出。 |
| thread_pool | 64 | 15.00% | — | 40, 300, 2700, 10000 | 该并发度超过这次运行所在机器的并行能力：执行体自报的耗时里含超订带来的调度等待，与「墙钟 / 并发度」不是同一件事，相减的结果没有意义（实测出现过负值）。端到端、吞吐与执行体自报值仍然有效，故照旧给出。 |
| zoo | 1 | 15.00% | 2700 | 40, 300, 2700, 10000 | 该档位是所测档位中最小的满足者；真实交叉点落在它与前一档之间 |
| zoo | 4 | 15.00% | — | 40, 300, 2700, 10000 | 该并发度超过这次运行所在机器的并行能力：执行体自报的耗时里含超订带来的调度等待，与「墙钟 / 并发度」不是同一件事，相减的结果没有意义（实测出现过负值）。端到端、吞吐与执行体自报值仍然有效，故照旧给出。 |
| zoo | 16 | 15.00% | — | 40, 300, 2700, 10000 | 该并发度超过这次运行所在机器的并行能力：执行体自报的耗时里含超订带来的调度等待，与「墙钟 / 并发度」不是同一件事，相减的结果没有意义（实测出现过负值）。端到端、吞吐与执行体自报值仍然有效，故照旧给出。 |
| zoo | 64 | 15.00% | — | 40, 300, 2700, 10000 | 该并发度超过这次运行所在机器的并行能力：执行体自报的耗时里含超订带来的调度等待，与「墙钟 / 并发度」不是同一件事，相减的结果没有意义（实测出现过负值）。端到端、吞吐与执行体自报值仍然有效，故照旧给出。 |

### 相对转折点

| 对照方案 | 并发度 | 该方案不再更快的档位（微秒） | 说明 |
|---|---|---|---|
| apscheduler | 1 | 40 | 该档位是所测档位中最小的满足者 |
| apscheduler | 4 | 40 | 该档位是所测档位中最小的满足者 |
| apscheduler | 16 | 40 | 该档位是所测档位中最小的满足者 |
| apscheduler | 64 | 40 | 该档位是所测档位中最小的满足者 |
| asyncio_pool | 1 | 300 | 该档位是所测档位中最小的满足者 |
| asyncio_pool | 4 | — | **未观测到**：所测档位内该对照方案始终快于被测框架 |
| asyncio_pool | 16 | — | **未观测到**：所测档位内该对照方案始终快于被测框架 |
| asyncio_pool | 64 | 10000 | 该档位是所测档位中最小的满足者 |
| bare_thread | 1 | 300 | 该档位是所测档位中最小的满足者 |
| bare_thread | 4 | — | **未观测到**：所测档位内该对照方案始终快于被测框架 |
| bare_thread | 16 | — | **未观测到**：所测档位内该对照方案始终快于被测框架 |
| bare_thread | 64 | — | **未观测到**：所测档位内该对照方案始终快于被测框架 |
| process_pool | 1 | 40 | 该档位是所测档位中最小的满足者 |
| process_pool | 4 | 40 | 该档位是所测档位中最小的满足者 |
| process_pool | 16 | — | **未观测到**：所测档位内该对照方案始终快于被测框架 |
| process_pool | 64 | — | **未观测到**：所测档位内该对照方案始终快于被测框架 |
| thread_pool | 1 | — | **未观测到**：所测档位内该对照方案始终快于被测框架 |
| thread_pool | 4 | — | **未观测到**：所测档位内该对照方案始终快于被测框架 |
| thread_pool | 16 | — | **未观测到**：所测档位内该对照方案始终快于被测框架 |
| thread_pool | 64 | 10000 | 该档位是所测档位中最小的满足者 |

## 图表

![overhead_ratio](figures/zh-overhead_ratio.svg)

> 仅并发度 4 的档位；比值仅在同一次运行内成立。并发度 16, 64 的开销数字已撤下（超出该机器并行能力，见口径章节），故不在图上

![throughput](figures/zh-throughput.svg)

> 仅执行体 40 微秒 档；吞吐仅在同一次运行内成立

![relative_multiple](figures/zh-relative_multiple.svg)

> 每个所测并发度各一个面板（共 4 个）；倍数仅在同一次运行内成立

## 维度：延迟分位数与抖动

> 端到端 / 并发度；分位数与相对离散度同表给出，只给中位数的度量不合格

| 并发度 | 执行体档位（微秒） | zoo | apscheduler | asyncio_pool | bare_thread | process_pool | thread_pool |
|---|---|---|---|---|---|---|---|
| 1 | 40 | 182.10 微秒 | 292.58 微秒 | 143.70 微秒 | 149.41 微秒 | 352.82 微秒 | 75.72 微秒 |
| 1 | 300 | 386.65 微秒 | 549.93 微秒 | 398.87 微秒 | 404.88 微秒 | 594.83 微秒 | 330.18 微秒 |
| 1 | 2700 | 2.736 毫秒 | 2.991 毫秒 | 2.778 毫秒 | 2.714 毫秒 | 2.951 毫秒 | 2.717 毫秒 |
| 1 | 10000 | 9.726 毫秒 | 9.741 毫秒 | 9.939 毫秒 | 9.438 毫秒 | 10.016 毫秒 | 9.708 毫秒 |
| 4 | 40 | 203.45 微秒 | 264.75 微秒 | 155.40 微秒 | 160.45 微秒 | 233.46 微秒 | 96.14 微秒 |
| 4 | 300 | 465.41 微秒 | 523.52 微秒 | 410.22 微秒 | 421.56 微秒 | 293.33 微秒 | 355.71 微秒 |
| 4 | 2700 | 2.884 毫秒 | 2.993 毫秒 | 2.762 毫秒 | 2.677 毫秒 | 1.389 毫秒 | 2.729 毫秒 |
| 4 | 10000 | 10.016 毫秒 | 9.919 毫秒 | 9.720 毫秒 | 9.673 毫秒 | 4.618 毫秒 | 9.759 毫秒 |
| 16 | 40 | 206.52 微秒 | 245.94 微秒 | 136.30 微秒 | 170.92 微秒 | 157.11 微秒 | 91.05 微秒 |
| 16 | 300 | 463.38 微秒 | 491.80 微秒 | 399.23 微秒 | 433.71 微秒 | 283.30 微秒 | 346.24 微秒 |
| 16 | 2700 | 2.875 毫秒 | 2.960 毫秒 | 2.844 毫秒 | 2.734 毫秒 | 1.430 毫秒 | 2.707 毫秒 |
| 16 | 10000 | 10.149 毫秒 | 10.207 毫秒 | 9.885 毫秒 | 9.515 毫秒 | 4.746 毫秒 | 9.680 毫秒 |
| 64 | 40 | 204.01 微秒 | 224.61 微秒 | 122.10 微秒 | 170.82 微秒 | 191.67 微秒 | 90.49 微秒 |
| 64 | 300 | 470.66 微秒 | 496.93 微秒 | 378.93 微秒 | 427.70 微秒 | 300.56 微秒 | 343.57 微秒 |
| 64 | 2700 | 2.891 毫秒 | 2.961 毫秒 | 2.754 毫秒 | 2.687 毫秒 | 1.376 毫秒 | 2.766 毫秒 |
| 64 | 10000 | 10.269 毫秒 | 10.691 毫秒 | 10.358 毫秒 | 9.802 毫秒 | 4.629 毫秒 | 10.397 毫秒 |

逐单元数值（分位数、离散度、各轮原始样本）见文末「附录：全部数值」。

## 维度：框架自身开销占比

> 开销 = 端到端/并发度 - 同一次运行内实测的执行体耗时（不做跨运行减法）。**带 — 的格**：该并发度超出这台机器的并行能力，执行体自报耗时含超订的调度等待，与该行的每任务端到端不可比，故不给开销数字（端到端与吞吐见各自的维度）

| 并发度 | 执行体档位（微秒） | zoo | apscheduler | asyncio_pool | bare_thread | process_pool | thread_pool |
|---|---|---|---|---|---|---|---|
| 1 | 40 | 71.79% | 80.15% | 65.83% | 64.64% | 84.46% | 40.53% |
| 1 | 300 | 43.97% | 44.02% | 26.35% | 26.00% | 49.83% | 12.18% |
| 1 | 2700 | 4.94% | 8.97% | 4.54% | 4.26% | 11.47% | 1.65% |
| 1 | 10000 | 1.68% | 3.67% | 2.05% | 1.36% | 3.15% | 0.70% |
| 4 | 40 | 73.41% | 79.88% | 65.20% | 68.16% | 59.90% | 48.10% |
| 4 | 300 | 33.89% | 40.02% | 26.02% | 29.31% | — | 15.90% |
| 4 | 2700 | 6.52% | 9.78% | 4.90% | 4.68% | — | 3.74% |
| 4 | 10000 | — | — | — | — | — | — |
| 16 | 40 | — | — | — | — | — | — |
| 16 | 300 | — | — | — | — | — | — |
| 16 | 2700 | — | — | — | — | — | — |
| 16 | 10000 | — | — | — | — | — | — |
| 64 | 40 | — | — | — | — | — | — |
| 64 | 300 | — | — | — | — | — | — |
| 64 | 2700 | — | — | — | — | — | — |
| 64 | 10000 | — | — | — | — | — | — |

逐单元数值（分位数、离散度、各轮原始样本）见文末「附录：全部数值」。

## 维度：吞吐与并发伸缩

> 吞吐 = 并发度 / 端到端中位数；随并发度是否继续上升即为伸缩性

| 并发度 | 执行体档位（微秒） | zoo | apscheduler | asyncio_pool | bare_thread | process_pool | thread_pool |
|---|---|---|---|---|---|---|---|
| 1 | 40 | 5491.5 | 3417.8 | 6958.7 | 6693.0 | 2834.3 | 13207.1 |
| 1 | 300 | 2586.3 | 1818.4 | 2507.1 | 2469.9 | 1681.2 | 3028.6 |
| 1 | 2700 | 365.5 | 334.3 | 360.0 | 368.5 | 338.9 | 368.0 |
| 1 | 10000 | 102.8 | 102.7 | 100.6 | 106.0 | 99.8 | 103.0 |
| 4 | 40 | 19661.0 | 15108.5 | 25740.3 | 24929.6 | 17133.9 | 41606.5 |
| 4 | 300 | 8594.6 | 7640.5 | 9750.8 | 9488.5 | 13636.3 | 11245.1 |
| 4 | 2700 | 1387.0 | 1336.6 | 1448.3 | 1494.0 | 2880.3 | 1465.9 |
| 4 | 10000 | 399.4 | 403.3 | 411.5 | 413.5 | 866.3 | 409.9 |
| 16 | 40 | 77474.6 | 65056.7 | 117388.0 | 93609.9 | 101836.3 | 175734.6 |
| 16 | 300 | 34528.5 | 32533.3 | 40077.0 | 36890.8 | 56477.9 | 46210.8 |
| 16 | 2700 | 5565.2 | 5405.6 | 5625.0 | 5852.3 | 11185.9 | 5909.9 |
| 16 | 10000 | 1576.5 | 1567.5 | 1618.7 | 1681.6 | 3371.6 | 1652.9 |
| 64 | 40 | 313716.1 | 284933.9 | 524166.3 | 374656.8 | 333912.8 | 707233.4 |
| 64 | 300 | 135978.9 | 128790.1 | 168896.4 | 149637.7 | 212933.5 | 186277.5 |
| 64 | 2700 | 22138.1 | 21617.7 | 23239.8 | 23821.1 | 46518.2 | 23134.1 |
| 64 | 10000 | 6232.3 | 5986.5 | 6178.8 | 6529.1 | 13825.1 | 6155.4 |

逐单元数值（分位数、离散度、各轮原始样本）见文末「附录：全部数值」。

## 维度：开销归因

> 口径：把每任务端到端拆成提交侧 / 手交 / 执行体 / 回程四段，并在同一档位与并发度下**与各对照方案逐段对照**，回答「超出对照的部分落在哪一段」。它是**诊断**而非主证据：抽样一小批档位，且不与对照方案比总开销。**手交为负不是错误**：那表示提交调用还没返回、执行体就已经开跑——把建线程一类工作算进提交侧的方案就会这样（实测 bare_thread 手交 -343 微秒）。**回程含完成信号的等待**（排空返回前的最后一段），它与主测量是同一口径

**状态：ok**

> 本维度是**诊断**不是主证据：抽样的档位与并发度固定为一小批，不覆盖矩阵里的全部单元。并发度上界取机器的并行能力——超过它时量到的是争用；

抽样档位（微秒）：40、10000；并发度：[1, 4]；该机器并行能力：4

| 方案 | 并发度 | 档位（微秒） | 提交侧 | 手交 | 执行体 | 回程 | 状态 |
|---|---|---|---|---|---|---|---|
| apscheduler | 1 | 40 | 107.03 微秒 | 88.74 微秒 | 51.01 微秒 | 40.43 微秒 | ok |
| apscheduler | 4 | 40 | 111.85 微秒 | 536.36 微秒 | 53.40 微秒 | 223.21 微秒 | ok |
| apscheduler | 1 | 10000 | 143.89 微秒 | 92.82 微秒 | 9.717 毫秒 | 52.57 微秒 | ok |
| apscheduler | 4 | 10000 | 115.81 微秒 | 12.770 毫秒 | 14.372 毫秒 | 9.716 毫秒 | ok |
| asyncio_pool | 1 | 40 | 17.44 微秒 | 26.24 微秒 | 49.78 微秒 | 57.13 微秒 | ok |
| asyncio_pool | 4 | 40 | 18.96 微秒 | 246.77 微秒 | 53.89 微秒 | 277.26 微秒 | ok |
| asyncio_pool | 1 | 10000 | 22.48 微秒 | 35.28 微秒 | 9.602 毫秒 | 83.05 微秒 | ok |
| asyncio_pool | 4 | 10000 | 24.14 微秒 | 12.532 毫秒 | 15.033 毫秒 | 9.857 毫秒 | ok |
| bare_thread | 1 | 40 | 145.72 微秒 | -77.75 微秒 | 53.16 微秒 | 31.65 微秒 | ok |
| bare_thread | 4 | 40 | 152.05 微秒 | -74.78 微秒 | 50.79 微秒 | 328.63 微秒 | ok |
| bare_thread | 1 | 10000 | 5.173 毫秒 | -5093.47 微秒 | 9.760 毫秒 | 36.84 微秒 | ok |
| bare_thread | 4 | 10000 | 5.190 毫秒 | -5085.13 微秒 | 14.764 毫秒 | 10.012 毫秒 | ok |
| process_pool | 1 | 40 | — | — | — | — | not_measurable：执行体的起止时刻读不到——它没有在本进程里运行（跨进程档位无法这样分段） |
| process_pool | 4 | 40 | — | — | — | — | not_measurable：执行体的起止时刻读不到——它没有在本进程里运行（跨进程档位无法这样分段） |
| process_pool | 1 | 10000 | — | — | — | — | not_measurable：执行体的起止时刻读不到——它没有在本进程里运行（跨进程档位无法这样分段） |
| process_pool | 4 | 10000 | — | — | — | — | not_measurable：执行体的起止时刻读不到——它没有在本进程里运行（跨进程档位无法这样分段） |
| thread_pool | 1 | 40 | 8.19 微秒 | 10.39 微秒 | 44.78 微秒 | 16.14 微秒 | ok |
| thread_pool | 4 | 40 | 10.76 微秒 | 188.77 微秒 | 51.29 微秒 | 156.66 微秒 | ok |
| thread_pool | 1 | 10000 | 11.97 微秒 | 16.35 微秒 | 9.403 毫秒 | 27.22 微秒 | ok |
| thread_pool | 4 | 10000 | 13.57 微秒 | 10.158 毫秒 | 14.997 毫秒 | 9.564 毫秒 | ok |
| zoo | 1 | 40 | 51.83 微秒 | 25.21 微秒 | 53.84 微秒 | 66.09 微秒 | ok |
| zoo | 4 | 40 | 62.86 微秒 | 339.07 微秒 | 56.15 微秒 | 317.39 微秒 | ok |
| zoo | 1 | 10000 | 87.64 微秒 | 30.13 微秒 | 9.804 毫秒 | 97.83 微秒 | ok |
| zoo | 4 | 10000 | 85.39 微秒 | 10.349 毫秒 | 14.876 毫秒 | 10.084 毫秒 | ok |

### 超出各对照方案的部分落在哪一段

| 对照方案 | 并发度 | 档位（微秒） | 每任务超出 | 主要落在 | 该段之差 |
|---|---|---|---|---|---|
| apscheduler | 1 | 40 | -93.68 微秒 | 回程 | 25.66 微秒 |
| asyncio_pool | 1 | 40 | 44.83 微秒 | 提交侧 | 34.38 微秒 |
| bare_thread | 1 | 40 | 43.01 微秒 | 手交 | 102.97 微秒 |
| thread_pool | 1 | 40 | 117.05 微秒 | 回程 | 49.95 微秒 |
| apscheduler | 4 | 40 | -169.63 微秒 | 回程 | 94.17 微秒 |
| asyncio_pool | 4 | 40 | 147.56 微秒 | 手交 | 92.30 微秒 |
| bare_thread | 4 | 40 | 287.24 微秒 | 手交 | 413.84 微秒 |
| thread_pool | 4 | 40 | 329.76 微秒 | 回程 | 160.73 微秒 |
| apscheduler | 1 | 10000 | 6.76 微秒 | 执行体 | 87.12 微秒 |
| asyncio_pool | 1 | 10000 | 249.94 微秒 | 执行体 | 202.42 微秒 |
| bare_thread | 1 | 10000 | 136.37 微秒 | 手交 | 5.124 毫秒 |
| thread_pool | 1 | 10000 | 550.56 微秒 | 执行体 | 401.60 微秒 |
| apscheduler | 4 | 10000 | 521.17 微秒 | 执行体 | 503.56 微秒 |
| asyncio_pool | 4 | 10000 | -75.24 微秒 | 回程 | 226.80 微秒 |
| bare_thread | 4 | 10000 | 8.602 毫秒 | 手交 | 15.434 毫秒 |
| thread_pool | 4 | 10000 | 552.31 微秒 | 回程 | 520.56 微秒 |

> 用到的插桩接缝（在 harness 侧临时包装，不改框架代码）：BaseWaiter._dispatch_worker（把 worker 交给调度模型）；WorkerDispatchCore.resolve_period / resolve_phase / resolve_run_timeout（每轮策略查询）；BaseWaiter.execute_service（走一次调度轮）

> **插桩自身的成本**（被测框架那一侧，由同一子进程里插桩前后两轮配对得到，可如实折价）：zoo 40 微秒 / 并发 1：不插桩 191.01 微秒 对插桩后 196.76 微秒，差 5.75 微秒；zoo 40 微秒 / 并发 4：不插桩 753.54 微秒 对插桩后 744.51 微秒，差 9.02 微秒（插桩后反而更快：这轮里机器漂移比插桩成本还大）；zoo 10000 微秒 / 并发 1：不插桩 10.042 毫秒 对插桩后 10.014 毫秒，差 28.37 微秒（插桩后反而更快：这轮里机器漂移比插桩成本还大）；zoo 10000 微秒 / 并发 4：不插桩 40.527 毫秒 对插桩后 40.236 毫秒，差 290.99 微秒（插桩后反而更快：这轮里机器漂移比插桩成本还大）

> **细分的可加性**：细分各项是**独立测量**：它们各自的耗时里都含自己被抢占的等待，故之和可能超过它们共同所在的提交侧（实测约 3%）。读的时候不要把它们当成一个可以相加的划分。本轮实测超出量：zoo 40 微秒 / 并发 4 超出 61.2%；zoo 10000 微秒 / 并发 1 超出 16.2%；zoo 10000 微秒 / 并发 4 超出 93.5%

### 被测框架的提交侧由什么构成

- 并发度 1、档位 40 微秒：调度轮其余（判定、锁与调度列表维护） 2.12 微秒；派发（交给调度模型，含池的入队） 25.01 微秒；每轮策略查询（周期/相位/超时各查一次配置） 17.20 微秒；提交侧其他（适配器自己的记账与完成信号状态） 7.39 微秒
- 并发度 4、档位 40 微秒：调度轮其余（判定、锁与调度列表维护） 0.00 微秒；派发（交给调度模型，含池的入队） 36.22 微秒；每轮策略查询（周期/相位/超时各查一次配置） 31.27 微秒；提交侧其他（适配器自己的记账与完成信号状态） 4.08 微秒
- 并发度 1、档位 10000 微秒：调度轮其余（判定、锁与调度列表维护） 3.16 微秒；派发（交给调度模型，含池的入队） 40.73 微秒；每轮策略查询（周期/相位/超时各查一次配置） 29.73 微秒；提交侧其他（适配器自己的记账与完成信号状态） 13.49 微秒
- 并发度 4、档位 10000 微秒：调度轮其余（判定、锁与调度列表维护） 0.00 微秒；派发（交给调度模型，含池的入队） 44.37 微秒；每轮策略查询（周期/相位/超时各查一次配置） 34.62 微秒；提交侧其他（适配器自己的记账与完成信号状态） 6.55 微秒

### 归因结论

- 并发度 1、执行体 40 微秒 下，被测框架整体不慢于 apscheduler（每任务 -94 微秒）：两边的时序结构不同，逐段差额有正有负，故不给「落在哪一段」。
- 并发度 1、执行体 40 微秒 下，被测框架相对 asyncio_pool 每任务多花 45 微秒，其中主要落在「提交侧」（+34 微秒）。
- 　注意：该组逐段差额并非同号——「手交」为 -1 微秒，读的时候要一并看。
- 并发度 1、执行体 40 微秒 下，被测框架相对 bare_thread 每任务多花 43 微秒，其中主要落在「手交」（+103 微秒）。
- 　注意：该组逐段差额并非同号——「提交侧」为 -94 微秒，读的时候要一并看。
- 并发度 1、执行体 40 微秒 下，被测框架相对 thread_pool 每任务多花 117 微秒，其中主要落在「回程」（+50 微秒）。
- 被测框架在该组的提交侧由以下部分构成（微秒）：调度轮其余（判定、锁与调度列表维护） 2、派发（交给调度模型，含池的入队） 25、每轮策略查询（周期/相位/超时各查一次配置） 17、提交侧其他（适配器自己的记账与完成信号状态） 7。
- 并发度 4、执行体 40 微秒 下，被测框架整体不慢于 apscheduler（每任务 -170 微秒）：两边的时序结构不同，逐段差额有正有负，故不给「落在哪一段」。
- 并发度 4、执行体 40 微秒 下，被测框架相对 asyncio_pool 每任务多花 148 微秒，其中主要落在「手交」（+92 微秒）。
- 并发度 4、执行体 40 微秒 下，被测框架相对 bare_thread 每任务多花 287 微秒，其中主要落在「手交」（+414 微秒）。
- 　注意：该组逐段差额并非同号——「提交侧」为 -89 微秒，读的时候要一并看。
- 并发度 4、执行体 40 微秒 下，被测框架相对 thread_pool 每任务多花 330 微秒，其中主要落在「回程」（+161 微秒）。
- 被测框架在该组的提交侧由以下部分构成（微秒）：调度轮其余（判定、锁与调度列表维护） 0、派发（交给调度模型，含池的入队） 36、每轮策略查询（周期/相位/超时各查一次配置） 31、提交侧其他（适配器自己的记账与完成信号状态） 4。
- 并发度 1、执行体 10000 微秒 下，被测框架相对 apscheduler 每任务多花 7 微秒，其中主要落在「执行体」（+87 微秒）。
- 　注意：该组逐段差额并非同号——「手交」为 -63 微秒，读的时候要一并看。
- 并发度 1、执行体 10000 微秒 下，被测框架相对 asyncio_pool 每任务多花 250 微秒，其中主要落在「执行体」（+202 微秒）。
- 　注意：该组逐段差额并非同号——「手交」为 -5 微秒，读的时候要一并看。
- 并发度 1、执行体 10000 微秒 下，被测框架相对 bare_thread 每任务多花 136 微秒，其中主要落在「手交」（+5124 微秒）。
- 　注意：该组逐段差额并非同号——「提交侧」为 -5085 微秒，读的时候要一并看。
- 并发度 1、执行体 10000 微秒 下，被测框架相对 thread_pool 每任务多花 551 微秒，其中主要落在「执行体」（+402 微秒）。
- 被测框架在该组的提交侧由以下部分构成（微秒）：调度轮其余（判定、锁与调度列表维护） 3、派发（交给调度模型，含池的入队） 41、每轮策略查询（周期/相位/超时各查一次配置） 30、提交侧其他（适配器自己的记账与完成信号状态） 13。
- 并发度 4、执行体 10000 微秒 下，被测框架相对 apscheduler 每任务多花 521 微秒，其中主要落在「执行体」（+504 微秒）。
- 　注意：该组逐段差额并非同号——「手交」为 -2422 微秒，读的时候要一并看。
- 并发度 4、执行体 10000 微秒 下，被测框架整体不慢于 asyncio_pool（每任务 -75 微秒）：两边的时序结构不同，逐段差额有正有负，故不给「落在哪一段」。
- 并发度 4、执行体 10000 微秒 下，被测框架相对 bare_thread 每任务多花 8602 微秒，其中主要落在「手交」（+15434 微秒）。
- 　注意：该组逐段差额并非同号——「提交侧」为 -5105 微秒，读的时候要一并看。
- 并发度 4、执行体 10000 微秒 下，被测框架相对 thread_pool 每任务多花 552 微秒，其中主要落在「回程」（+521 微秒）。
- 　注意：该组逐段差额并非同号——「执行体」为 -121 微秒，读的时候要一并看。
- 被测框架在该组的提交侧由以下部分构成（微秒）：调度轮其余（判定、锁与调度列表维护） 0、派发（交给调度模型，含池的入队） 44、每轮策略查询（周期/相位/超时各查一次配置） 35、提交侧其他（适配器自己的记账与完成信号状态） 7。

## 维度：调度语义的代价

> 口径：本维度采用**内部开关对照**（同一 workload 下语义全关 vs 逐个开启），**不与对照方案横向比较**——裸写法没有优先级/超时/重试的对应物，故只能回答“本框架的语义值多少钱”，不能回答“比裸写法贵多少”

**状态：ok**（结论在该次测量装着的「current」代驱动面上得出）

| 语义项 | 层级 | 探查方式 | 可测 | 证据 / 原因 |
|---|---|---|---|---|
| 超时 | 派发层 | 行为探查（按调度轮反复驱动，量在飞表摘除时刻） | 是 | 已观测到超时摘除：在执行体结束之前离开在飞表（0.0123s）（执行体 0.15s、run_timeout 0.01s）；判定动作在 dispatch_core.py:365；生效的是观测与熔断（记录、标记不健康、摘除在飞登记、停止派发），**不是终止**仍在执行的 worker——CPython 无法安全中断线程 |
| 优先级 | 事件层 | 结构探查（检查执行所需的符号是否存在） | 否 | 未复核：本项的结论是在「previous」代上得出的，把它当成本代的事实等于在报告里断言一个当前代并不具备的接线。重新推导需要单独一次探查设计（每项要有干净的开/关态才谈得上定价） |
| 重试 | 事件层 | 结构探查（检查执行所需的符号是否存在） | 否 | 未复核：本项的结论是在「previous」代上得出的，把它当成本代的事实等于在报告里断言一个当前代并不具备的接线。重新推导需要单独一次探查设计（每项要有干净的开/关态才谈得上定价） |

> 本结论按被测版本得出，坐标只对该版本成立；往 matrix.yaml 追加版本后须重跑本探查

## 维度：原生任务线：同一被测对象的三种执行形态

> 口径：该线独立测量：它不进入主矩阵的透视表与交叉点，其数值也不可与那些表里的对照方案横向比较

**该线结论：not_applicable**

被测框架不具备该能力（找不到这些符号：adaptive_params, dual_arm_worker, native_params, native_task_worker）——该线对此版本不适用，这不是失败

等价性门禁：未跑到（前置探查没走到这一步）

> 所测任务 modbus_rtu.parse_response——Modbus RTU 响应帧解析：输入是一条裸 RTU ADU 响应帧（不含任何传输层封装），其长度即该档位的帧字节

> 规模档位 R1、R8、R125（帧字节 7、21、255）；并发度 1、4、16、64；每格预热 100 轮 + 采样 100 轮，每个并发度一个子进程（共 4 个）

## 被测框架在哪些档位更快

> 被测框架处于优势的档位（两侧差异大于该档位的带宽）。它与「公开的不利数据」出自**同一份同运行内的相对比**，只是一个取更快的、一个取更慢的——两者的覆盖面相同，故谁都挑不了档位。**本节的缺席不构成不合格**：分不出胜负或处处更慢时它就应当是空的

| 对照方案 | 并发度 | 执行体档位（微秒） | 差距 | 被测框架中位数 |
|---|---|---|---|---|
| apscheduler | 1 | 40 | 被测框架比 apscheduler 快 1.61x | 182.10 微秒 |
| process_pool | 1 | 40 | 被测框架比 process_pool 快 1.94x | 182.10 微秒 |
| apscheduler | 1 | 300 | 被测框架比 apscheduler 快 1.42x | 386.65 微秒 |
| process_pool | 1 | 300 | 被测框架比 process_pool 快 1.54x | 386.65 微秒 |
| apscheduler | 1 | 2700 | 被测框架比 apscheduler 快 1.09x | 2.736 毫秒 |
| process_pool | 1 | 2700 | 被测框架比 process_pool 快 1.08x | 2.736 毫秒 |
| asyncio_pool | 1 | 10000 | 被测框架比 asyncio_pool 快 1.02x | 9.726 毫秒 |
| process_pool | 1 | 10000 | 被测框架比 process_pool 快 1.03x | 9.726 毫秒 |
| apscheduler | 4 | 40 | 被测框架比 apscheduler 快 1.30x | 203.45 微秒 |
| apscheduler | 4 | 300 | 被测框架比 apscheduler 快 1.12x | 465.41 微秒 |
| apscheduler | 4 | 2700 | 被测框架比 apscheduler 快 1.04x | 2.884 毫秒 |
| apscheduler | 16 | 40 | 被测框架比 apscheduler 快 1.19x | 206.52 微秒 |
| apscheduler | 16 | 300 | 被测框架比 apscheduler 快 1.06x | 463.38 微秒 |
| apscheduler | 16 | 2700 | 被测框架比 apscheduler 快 1.03x | 2.875 毫秒 |
| apscheduler | 64 | 300 | 被测框架比 apscheduler 快 1.06x | 470.66 微秒 |

## 公开的不利数据

> 被测框架处于劣势的档位（两侧差异大于该档位的带宽）。**这部分缺失的报告不合格**——一份只展示自己赢的报告，读者有理由认为它不可信。差异小于带宽的档位不在本节，而在「分不出胜负」那一节：那是判据的结果，不是把它们藏起来

| 对照方案 | 并发度 | 执行体档位（微秒） | 差距 | 被测框架中位数 |
|---|---|---|---|---|
| asyncio_pool | 1 | 40 | asyncio_pool 比 zoo 快 1.27x | 182.10 微秒 |
| thread_pool | 1 | 40 | thread_pool 比 zoo 快 2.41x | 182.10 微秒 |
| bare_thread | 1 | 10000 | bare_thread 比 zoo 快 1.03x | 9.726 毫秒 |
| asyncio_pool | 4 | 40 | asyncio_pool 比 zoo 快 1.31x | 203.45 微秒 |
| bare_thread | 4 | 40 | bare_thread 比 zoo 快 1.27x | 203.45 微秒 |
| thread_pool | 4 | 40 | thread_pool 比 zoo 快 2.12x | 203.45 微秒 |
| asyncio_pool | 4 | 300 | asyncio_pool 比 zoo 快 1.13x | 465.41 微秒 |
| bare_thread | 4 | 300 | bare_thread 比 zoo 快 1.10x | 465.41 微秒 |
| process_pool | 4 | 300 | process_pool 比 zoo 快 1.59x | 465.41 微秒 |
| thread_pool | 4 | 300 | thread_pool 比 zoo 快 1.31x | 465.41 微秒 |
| asyncio_pool | 4 | 2700 | asyncio_pool 比 zoo 快 1.04x | 2.884 毫秒 |
| bare_thread | 4 | 2700 | bare_thread 比 zoo 快 1.08x | 2.884 毫秒 |
| process_pool | 4 | 2700 | process_pool 比 zoo 快 2.08x | 2.884 毫秒 |
| thread_pool | 4 | 2700 | thread_pool 比 zoo 快 1.06x | 2.884 毫秒 |
| asyncio_pool | 4 | 10000 | asyncio_pool 比 zoo 快 1.03x | 10.016 毫秒 |
| bare_thread | 4 | 10000 | bare_thread 比 zoo 快 1.04x | 10.016 毫秒 |
| process_pool | 4 | 10000 | process_pool 比 zoo 快 2.17x | 10.016 毫秒 |
| thread_pool | 4 | 10000 | thread_pool 比 zoo 快 1.03x | 10.016 毫秒 |
| asyncio_pool | 16 | 40 | asyncio_pool 比 zoo 快 1.52x | 206.52 微秒 |
| bare_thread | 16 | 40 | bare_thread 比 zoo 快 1.21x | 206.52 微秒 |
| process_pool | 16 | 40 | process_pool 比 zoo 快 1.31x | 206.52 微秒 |
| thread_pool | 16 | 40 | thread_pool 比 zoo 快 2.27x | 206.52 微秒 |
| asyncio_pool | 16 | 300 | asyncio_pool 比 zoo 快 1.16x | 463.38 微秒 |
| bare_thread | 16 | 300 | bare_thread 比 zoo 快 1.07x | 463.38 微秒 |
| process_pool | 16 | 300 | process_pool 比 zoo 快 1.64x | 463.38 微秒 |
| thread_pool | 16 | 300 | thread_pool 比 zoo 快 1.34x | 463.38 微秒 |
| bare_thread | 16 | 2700 | bare_thread 比 zoo 快 1.05x | 2.875 毫秒 |
| process_pool | 16 | 2700 | process_pool 比 zoo 快 2.01x | 2.875 毫秒 |
| thread_pool | 16 | 2700 | thread_pool 比 zoo 快 1.06x | 2.875 毫秒 |
| asyncio_pool | 16 | 10000 | asyncio_pool 比 zoo 快 1.03x | 10.149 毫秒 |
| bare_thread | 16 | 10000 | bare_thread 比 zoo 快 1.07x | 10.149 毫秒 |
| process_pool | 16 | 10000 | process_pool 比 zoo 快 2.14x | 10.149 毫秒 |
| thread_pool | 16 | 10000 | thread_pool 比 zoo 快 1.05x | 10.149 毫秒 |
| asyncio_pool | 64 | 40 | asyncio_pool 比 zoo 快 1.67x | 204.01 微秒 |
| bare_thread | 64 | 40 | bare_thread 比 zoo 快 1.19x | 204.01 微秒 |
| thread_pool | 64 | 40 | thread_pool 比 zoo 快 2.25x | 204.01 微秒 |
| asyncio_pool | 64 | 300 | asyncio_pool 比 zoo 快 1.24x | 470.66 微秒 |
| bare_thread | 64 | 300 | bare_thread 比 zoo 快 1.10x | 470.66 微秒 |
| process_pool | 64 | 300 | process_pool 比 zoo 快 1.57x | 470.66 微秒 |
| thread_pool | 64 | 300 | thread_pool 比 zoo 快 1.37x | 470.66 微秒 |
| asyncio_pool | 64 | 2700 | asyncio_pool 比 zoo 快 1.05x | 2.891 毫秒 |
| bare_thread | 64 | 2700 | bare_thread 比 zoo 快 1.08x | 2.891 毫秒 |
| process_pool | 64 | 2700 | process_pool 比 zoo 快 2.10x | 2.891 毫秒 |
| thread_pool | 64 | 2700 | thread_pool 比 zoo 快 1.04x | 2.891 毫秒 |
| bare_thread | 64 | 10000 | bare_thread 比 zoo 快 1.05x | 10.269 毫秒 |
| process_pool | 64 | 10000 | process_pool 比 zoo 快 2.22x | 10.269 毫秒 |

## 分不出胜负的档位

> 两侧**分不出胜负**的档位：差异小于该档位的带宽。带宽取自**同一次运行**内两侧各自的跨轮离散度（每任务中位数的标准差 / 中位数）之和，故它随样本变化，读者可用留档里的逐轮样本自行复核。它同样覆盖全部所测档位、逐项写明原因——**本节不是藏东西的地方**：把噪声级差异报成「快 1.00x」才是

> 判据：带宽 = 被测框架侧与对照侧各自的跨轮相对离散度之和；单侧的跨轮相对离散度 = 该单元逐轮的「每任务中位数」的标准差 / 中位数

本期带宽：0.9% 到 24.7%（随各档位的离散度不同而不同）。

| 对照方案 | 并发度 | 执行体档位（微秒） | 比值 | 原因 |
|---|---|---|---|---|
| bare_thread | 1 | 40 | 0.82x | 两侧差异 18.0% 小于带宽 20.5%，分不出胜负 |
| asyncio_pool | 1 | 300 | 1.03x | 两侧差异 3.2% 小于带宽 18.0%，分不出胜负 |
| bare_thread | 1 | 300 | 1.05x | 两侧差异 4.7% 小于带宽 17.5%，分不出胜负 |
| thread_pool | 1 | 300 | 0.85x | 两侧差异 14.6% 小于带宽 16.8%，分不出胜负 |
| asyncio_pool | 1 | 2700 | 1.02x | 两侧差异 1.5% 小于带宽 3.3%，分不出胜负 |
| bare_thread | 1 | 2700 | 0.99x | 两侧差异 0.8% 小于带宽 2.5%，分不出胜负 |
| thread_pool | 1 | 2700 | 0.99x | 两侧差异 0.7% 小于带宽 1.5%，分不出胜负 |
| apscheduler | 1 | 10000 | 1.00x | 两侧差异 0.2% 小于带宽 1.1%，分不出胜负 |
| thread_pool | 1 | 10000 | 1.00x | 两侧差异 0.2% 小于带宽 1.7%，分不出胜负 |
| process_pool | 4 | 40 | 1.15x | 两侧差异 14.7% 小于带宽 21.8%，分不出胜负 |
| apscheduler | 4 | 10000 | 0.99x | 两侧差异 1.0% 小于带宽 5.0%，分不出胜负 |
| asyncio_pool | 16 | 2700 | 0.99x | 两侧差异 1.1% 小于带宽 5.0%，分不出胜负 |
| apscheduler | 16 | 10000 | 1.01x | 两侧差异 0.6% 小于带宽 1.6%，分不出胜负 |
| apscheduler | 64 | 40 | 1.10x | 两侧差异 10.1% 小于带宽 16.6%，分不出胜负 |
| process_pool | 64 | 40 | 0.94x | 两侧差异 6.0% 小于带宽 12.0%，分不出胜负 |
| apscheduler | 64 | 2700 | 1.02x | 两侧差异 2.4% 小于带宽 2.9%，分不出胜负 |
| apscheduler | 64 | 10000 | 1.04x | 两侧差异 4.1% 小于带宽 4.9%，分不出胜负 |
| asyncio_pool | 64 | 10000 | 1.01x | 两侧差异 0.9% 小于带宽 3.8%，分不出胜负 |
| thread_pool | 64 | 10000 | 1.01x | 两侧差异 1.3% 小于带宽 3.7%，分不出胜负 |

## 口径局限与偏差来源

- **被测层级**：调度派发层：直接驱动 BaseWaiter.execute_service()（线程池模式），不走 Master 的完整运行循环——后者的服务循环每秒一次，会把延迟量级从微秒抬到秒。**每提交一个任务走一次调度轮**，故该轮的全部簿记都计在这一个任务头上；Master 的用法是每轮服务多个 worker，那份开销本会摊到多个任务上
- **口径说明**（apscheduler）：APScheduler 的定时作业模型，含作业登记与触发判定成本；该库会吞掉作业内异常，本档已在 drain 时重新抛出。**口径说明**：该库不提供作业完成通知，故完成信号由本档的 Condition 给出，每任务一次通知的开销计入其端到端
- **口径说明**（asyncio_pool）：asyncio 事件循环调度**同步**执行体（等价于 loop.run_in_executor），非原生协程并发；与线程池的差别是事件循环自身开销
- **口径说明**（bare_thread）：每任务派生一个 threading.Thread，无池化、无复用；线程创建成本计入端到端。收集执行体自报耗时用无锁的 list.append（GIL 下本身原子）——**插桩不得给某一档加别档没有的成本**，否则对照就成了插桩的对照
- **口径说明**（process_pool）：ProcessPoolExecutor：执行体与返回值跨进程序列化的成本计入端到端，与多线程档位不可直接等价比较
- **口径说明**（thread_pool）：concurrent.futures.ThreadPoolExecutor，池大小 = 并发度；线程复用、无任务队列语义
- **口径说明**（zoo）：端到端终点为「worker 完成并在飞表注销」；框架其后的结果投递按世代分流：上一代的投递路径是坏的（dispatch 按 reactor_name 而非主题查响应器，每次调用必抛），完成信号只能取自框架内部回调；当前代该处已修好，完成信号取自框架自己的结果响应器。**口径说明**：完成信号由本档的 Condition 给出，每任务一次通知的开销计入其端到端；该方向的偏差使被测框架看起来更慢，即对被测框架不利而非有利
- **不给出开销数字的组**：以下 (适配器, 并发度) 组的并发度超过这次运行所在机器的并行能力：执行体自报的耗时里含超订带来的调度等待，与「墙钟 / 并发度」不是同一件事，相减的结果没有意义（实测出现过负值，并衍生出无意义的变化倍数）。故本报告对它们**不给框架开销、也不给交叉点**；端到端、吞吐与执行体自报值仍然有效，原始留档里的字段也一个没删。判据取自环境自述的逻辑核数，另有一条证据性兜底：算出来的开销为负同样判为不可读——框架只会加时间不会减时间
- **原生任务线：未出结论**：原生任务线结论为 not_applicable（被测框架不具备该能力（找不到这些符号：adaptive_params, dual_arm_worker, native_params, native_task_worker）——该线对此版本不适用，这不是失败）、未产出任何数字。它记在这里而不是并入自检：一条线的失败不得拖住其余版本的数据与主矩阵
- **未参与判定的自检项**：这些单元的执行体档位偏差未参与判定（并发度高于最低档，或档位短到墙钟受调度颗粒度支配）。原始值仍在场，但那两处的墙钟不足以断定校准是否正确——**读这些档位的数字时要把它算进去**

> 绝对耗时：仅在同一次运行内部有效，不可跨运行比较

## 加入你自己的对照

本 harness 的对照方案是**开放**的：实现 `zoo_bench.adapters.BaseAdapter` 的四个方法（`setup` / `submit` / `drain` / `teardown`），用 `zoo_bench.adapters.registry.register` 登记，或在 `matrix.yaml` 的 `extra_modules` 里列出你的模块路径——**无需改动本仓库任何文件**。你的实现会通过同一套等价性验证（提交 N 个执行体、断言全部执行且各执行一次），不通过的不会被采信。**我们主动把这条路径写进报告**：一份由被测框架维护者撰写、测量被测框架的报告，读者有理由怀疑对照被写慢或口径被挑选；让任何人能提交自己的对照，是这份报告可被质疑、也可被证伪的前提。

## 自检

- 测量自检整体：通过
- 进程隔离：{'parent_pid': 16507, 'child_pids': [16965, 16968, 16971, 16974, 16977, 16983, 16989, 16995, 17001, 17019, 17037, 17055, 17076, 17132, 17187, 17241, 17308, 17310, 17312, 17314, 17316, 17321, 17326, 17331, 17336, 17353, 17370, 17388, 17405, 17464, 17523, 17585, 17654, 17688, 17722, 17756, 17790, 17923, 18056, 18189, 18322, 18851, 19380, 19909, 20439, 22552, 24665, 26778, 28894, 28898, 28902, 28906, 28910, 28917, 28924, 28931, 28938, 28957, 28976, 28995, 29014, 29081, 29148, 29215, 29284, 29286, 29288, 29290, 29292, 29297, 29302, 29307, 29312, 29329, 29346, 29363, 29380, 29437, 29494, 29552, 29618, 29620, 29622, 29624, 29626, 29631, 29636, 29641, 29646, 29663, 29680, 29699, 29716, 29753, 29789, 29830], 'all_distinct': True, 'none_equals_parent': True}

## 附录：全部数值

> 正文为可读性只给透视表；这里逐单元给出**改动前的全部字段**（分位数、离散度、执行体实测等）。**数值一个不少**：明细放在报告主体内，而不是外链、折叠或附件——「可查」一旦要另外去找，就等于不可查

### 附录：延迟分位数与抖动

| 方案 | 并发度 | 执行体档位（微秒） | 中位数 | p95 | p99 | 相对离散度 |
|---|---|---|---|---|---|---|
| apscheduler | 1 | 40 | 292.58 微秒 | 336.06 微秒 | 345.13 微秒 | 0.065 |
| apscheduler | 1 | 300 | 549.93 微秒 | 599.28 微秒 | 604.80 微秒 | 0.038 |
| apscheduler | 1 | 2700 | 2.991 毫秒 | 3.029 毫秒 | 3.303 毫秒 | 0.033 |
| apscheduler | 1 | 10000 | 9.741 毫秒 | 9.805 毫秒 | 9.851 毫秒 | 0.004 |
| apscheduler | 4 | 40 | 264.75 微秒 | 271.06 微秒 | 293.70 微秒 | 0.031 |
| apscheduler | 4 | 300 | 523.52 微秒 | 548.69 微秒 | 583.69 微秒 | 0.029 |
| apscheduler | 4 | 2700 | 2.993 毫秒 | 3.061 毫秒 | 3.107 毫秒 | 0.013 |
| apscheduler | 4 | 10000 | 9.919 毫秒 | 10.071 毫秒 | 11.589 毫秒 | 0.043 |
| apscheduler | 16 | 40 | 245.94 微秒 | 257.54 微秒 | 259.33 微秒 | 0.028 |
| apscheduler | 16 | 300 | 491.80 微秒 | 525.31 微秒 | 537.30 微秒 | 0.032 |
| apscheduler | 16 | 2700 | 2.960 毫秒 | 3.070 毫秒 | 3.141 毫秒 | 0.018 |
| apscheduler | 16 | 10000 | 10.207 毫秒 | 10.331 毫秒 | 10.404 毫秒 | 0.011 |
| apscheduler | 64 | 40 | 224.61 微秒 | 311.15 微秒 | 313.64 微秒 | 0.133 |
| apscheduler | 64 | 300 | 496.93 微秒 | 541.31 微秒 | 550.31 微秒 | 0.035 |
| apscheduler | 64 | 2700 | 2.961 毫秒 | 3.037 毫秒 | 3.203 毫秒 | 0.022 |
| apscheduler | 64 | 10000 | 10.691 毫秒 | 10.787 毫秒 | 10.808 毫秒 | 0.026 |
| asyncio_pool | 1 | 40 | 143.70 微秒 | 168.43 微秒 | 173.46 微秒 | 0.071 |
| asyncio_pool | 1 | 300 | 398.87 微秒 | 434.65 微秒 | 468.32 微秒 | 0.049 |
| asyncio_pool | 1 | 2700 | 2.778 毫秒 | 2.871 毫秒 | 3.029 毫秒 | 0.025 |
| asyncio_pool | 1 | 10000 | 9.939 毫秒 | 10.037 毫秒 | 10.061 毫秒 | 0.006 |
| asyncio_pool | 4 | 40 | 155.40 微秒 | 183.35 微秒 | 187.06 微秒 | 0.088 |
| asyncio_pool | 4 | 300 | 410.22 微秒 | 424.86 微秒 | 436.27 微秒 | 0.026 |
| asyncio_pool | 4 | 2700 | 2.762 毫秒 | 2.837 毫秒 | 2.858 毫秒 | 0.014 |
| asyncio_pool | 4 | 10000 | 9.720 毫秒 | 9.864 毫秒 | 10.027 毫秒 | 0.010 |
| asyncio_pool | 16 | 40 | 136.30 微秒 | 154.75 微秒 | 161.27 微秒 | 0.079 |
| asyncio_pool | 16 | 300 | 399.23 微秒 | 412.12 微秒 | 415.30 微秒 | 0.023 |
| asyncio_pool | 16 | 2700 | 2.844 毫秒 | 3.071 毫秒 | 3.292 毫秒 | 0.040 |
| asyncio_pool | 16 | 10000 | 9.885 毫秒 | 10.012 毫秒 | 10.668 毫秒 | 0.021 |
| asyncio_pool | 64 | 40 | 122.10 微秒 | 125.76 微秒 | 127.15 微秒 | 0.019 |
| asyncio_pool | 64 | 300 | 378.93 微秒 | 385.83 微秒 | 386.46 微秒 | 0.011 |
| asyncio_pool | 64 | 2700 | 2.754 毫秒 | 2.796 毫秒 | 2.860 毫秒 | 0.011 |
| asyncio_pool | 64 | 10000 | 10.358 毫秒 | 10.465 毫秒 | 10.487 毫秒 | 0.015 |
| bare_thread | 1 | 40 | 149.41 微秒 | 189.01 微秒 | 193.86 微秒 | 0.126 |
| bare_thread | 1 | 300 | 404.88 微秒 | 445.16 微秒 | 451.81 微秒 | 0.044 |
| bare_thread | 1 | 2700 | 2.714 毫秒 | 2.798 毫秒 | 2.878 毫秒 | 0.017 |
| bare_thread | 1 | 10000 | 9.438 毫秒 | 9.589 毫秒 | 9.611 毫秒 | 0.007 |
| bare_thread | 4 | 40 | 160.45 微秒 | 178.72 微秒 | 191.71 微秒 | 0.057 |
| bare_thread | 4 | 300 | 421.56 微秒 | 440.96 微秒 | 448.37 微秒 | 0.025 |
| bare_thread | 4 | 2700 | 2.677 毫秒 | 2.733 毫秒 | 2.753 毫秒 | 0.009 |
| bare_thread | 4 | 10000 | 9.673 毫秒 | 9.764 毫秒 | 10.007 毫秒 | 0.010 |
| bare_thread | 16 | 40 | 170.92 微秒 | 179.62 微秒 | 180.11 微秒 | 0.026 |
| bare_thread | 16 | 300 | 433.71 微秒 | 447.00 微秒 | 450.27 微秒 | 0.014 |
| bare_thread | 16 | 2700 | 2.734 毫秒 | 2.765 毫秒 | 2.767 毫秒 | 0.005 |
| bare_thread | 16 | 10000 | 9.515 毫秒 | 9.597 毫秒 | 9.637 毫秒 | 0.004 |
| bare_thread | 64 | 40 | 170.82 微秒 | 173.53 微秒 | 174.01 微秒 | 0.009 |
| bare_thread | 64 | 300 | 427.70 微秒 | 447.06 微秒 | 468.46 微秒 | 0.024 |
| bare_thread | 64 | 2700 | 2.687 毫秒 | 2.778 毫秒 | 2.947 毫秒 | 0.023 |
| bare_thread | 64 | 10000 | 9.802 毫秒 | 9.963 毫秒 | 10.025 毫秒 | 0.008 |
| process_pool | 1 | 40 | 352.82 微秒 | 384.48 微秒 | 393.24 微秒 | 0.057 |
| process_pool | 1 | 300 | 594.83 微秒 | 632.73 微秒 | 767.68 微秒 | 0.075 |
| process_pool | 1 | 2700 | 2.951 毫秒 | 2.990 毫秒 | 3.001 毫秒 | 0.008 |
| process_pool | 1 | 10000 | 10.016 毫秒 | 10.125 毫秒 | 10.169 毫秒 | 0.005 |
| process_pool | 4 | 40 | 233.46 微秒 | 270.06 微秒 | 288.01 微秒 | 0.139 |
| process_pool | 4 | 300 | 293.33 微秒 | 348.68 微秒 | 351.02 微秒 | 0.072 |
| process_pool | 4 | 2700 | 1.389 毫秒 | 1.500 毫秒 | 1.547 毫秒 | 0.034 |
| process_pool | 4 | 10000 | 4.618 毫秒 | 4.788 毫秒 | 4.890 毫秒 | 0.016 |
| process_pool | 16 | 40 | 157.11 微秒 | 215.42 微秒 | 223.27 微秒 | 0.180 |
| process_pool | 16 | 300 | 283.30 微秒 | 348.25 微秒 | 362.65 微秒 | 0.103 |
| process_pool | 16 | 2700 | 1.430 毫秒 | 1.563 毫秒 | 1.599 毫秒 | 0.043 |
| process_pool | 16 | 10000 | 4.746 毫秒 | 4.866 毫秒 | 4.892 毫秒 | 0.018 |
| process_pool | 64 | 40 | 191.67 微秒 | 226.49 微秒 | 236.11 微秒 | 0.088 |
| process_pool | 64 | 300 | 300.56 微秒 | 334.45 微秒 | 347.78 微秒 | 0.057 |
| process_pool | 64 | 2700 | 1.376 毫秒 | 1.401 毫秒 | 1.413 毫秒 | 0.012 |
| process_pool | 64 | 10000 | 4.629 毫秒 | 4.715 毫秒 | 4.881 毫秒 | 0.014 |
| thread_pool | 1 | 40 | 75.72 微秒 | 100.80 微秒 | 121.94 微秒 | 0.168 |
| thread_pool | 1 | 300 | 330.18 微秒 | 350.74 微秒 | 362.26 微秒 | 0.037 |
| thread_pool | 1 | 2700 | 2.717 毫秒 | 2.763 毫秒 | 2.769 毫秒 | 0.007 |
| thread_pool | 1 | 10000 | 9.708 毫秒 | 9.862 毫秒 | 10.024 毫秒 | 0.010 |
| thread_pool | 4 | 40 | 96.14 微秒 | 103.84 微秒 | 104.87 微秒 | 0.040 |
| thread_pool | 4 | 300 | 355.71 微秒 | 370.90 微秒 | 376.79 微秒 | 0.022 |
| thread_pool | 4 | 2700 | 2.729 毫秒 | 2.823 毫秒 | 2.839 毫秒 | 0.018 |
| thread_pool | 4 | 10000 | 9.759 毫秒 | 9.887 毫秒 | 9.994 毫秒 | 0.009 |
| thread_pool | 16 | 40 | 91.05 微秒 | 94.68 微秒 | 97.78 微秒 | 0.032 |
| thread_pool | 16 | 300 | 346.24 微秒 | 358.28 微秒 | 362.52 微秒 | 0.018 |
| thread_pool | 16 | 2700 | 2.707 毫秒 | 2.746 毫秒 | 2.754 毫秒 | 0.009 |
| thread_pool | 16 | 10000 | 9.680 毫秒 | 9.832 毫秒 | 9.950 毫秒 | 0.009 |
| thread_pool | 64 | 40 | 90.49 微秒 | 92.03 微秒 | 92.25 微秒 | 0.015 |
| thread_pool | 64 | 300 | 343.57 微秒 | 347.83 微秒 | 351.25 微秒 | 0.008 |
| thread_pool | 64 | 2700 | 2.766 毫秒 | 2.799 毫秒 | 2.822 毫秒 | 0.008 |
| thread_pool | 64 | 10000 | 10.397 毫秒 | 10.501 毫秒 | 10.626 毫秒 | 0.013 |
| zoo | 1 | 40 | 182.10 微秒 | 212.72 微秒 | 219.88 微秒 | 0.079 |
| zoo | 1 | 300 | 386.65 微秒 | 493.90 微秒 | 501.64 微秒 | 0.130 |
| zoo | 1 | 2700 | 2.736 毫秒 | 2.784 毫秒 | 2.814 毫秒 | 0.008 |
| zoo | 1 | 10000 | 9.726 毫秒 | 9.847 毫秒 | 9.885 毫秒 | 0.007 |
| zoo | 4 | 40 | 203.45 微秒 | 213.52 微秒 | 256.87 微秒 | 0.079 |
| zoo | 4 | 300 | 465.41 微秒 | 494.09 微秒 | 521.87 微秒 | 0.039 |
| zoo | 4 | 2700 | 2.884 毫秒 | 2.956 毫秒 | 2.961 毫秒 | 0.014 |
| zoo | 4 | 10000 | 10.016 毫秒 | 10.137 毫秒 | 10.200 毫秒 | 0.007 |
| zoo | 16 | 40 | 206.52 微秒 | 213.77 微秒 | 214.47 微秒 | 0.029 |
| zoo | 16 | 300 | 463.38 微秒 | 473.35 微秒 | 475.28 微秒 | 0.015 |
| zoo | 16 | 2700 | 2.875 毫秒 | 2.913 毫秒 | 2.922 毫秒 | 0.010 |
| zoo | 16 | 10000 | 10.149 毫秒 | 10.221 毫秒 | 10.256 毫秒 | 0.005 |
| zoo | 64 | 40 | 204.01 微秒 | 208.81 微秒 | 225.33 微秒 | 0.032 |
| zoo | 64 | 300 | 470.66 微秒 | 477.84 微秒 | 479.97 微秒 | 0.009 |
| zoo | 64 | 2700 | 2.891 毫秒 | 2.931 毫秒 | 2.941 毫秒 | 0.007 |
| zoo | 64 | 10000 | 10.269 毫秒 | 10.682 毫秒 | 10.891 毫秒 | 0.024 |

### 附录：框架自身开销占比

| 方案 | 并发度 | 执行体档位（微秒） | 框架开销 | 开销占比 | 执行体实测 |
|---|---|---|---|---|---|
| apscheduler | 1 | 40 | 234.51 微秒 | 80.15% | 58.08 微秒 |
| apscheduler | 1 | 300 | 242.09 微秒 | 44.02% | 307.83 微秒 |
| apscheduler | 1 | 2700 | 268.18 微秒 | 8.97% | 2.723 毫秒 |
| apscheduler | 1 | 10000 | 357.36 微秒 | 3.67% | 9.384 毫秒 |
| apscheduler | 4 | 40 | 211.48 微秒 | 79.88% | 53.27 微秒 |
| apscheduler | 4 | 300 | 209.50 微秒 | 40.02% | 314.03 微秒 |
| apscheduler | 4 | 2700 | 292.59 微秒 | 9.78% | 2.700 毫秒 |
| apscheduler | 4 | 10000 | — | — | 13.824 毫秒 |
| apscheduler | 16 | 40 | — | — | 52.81 微秒 |
| apscheduler | 16 | 300 | — | — | 309.74 微秒 |
| apscheduler | 16 | 2700 | — | — | 2.710 毫秒 |
| apscheduler | 16 | 10000 | — | — | 19.774 毫秒 |
| apscheduler | 64 | 40 | — | — | 50.68 微秒 |
| apscheduler | 64 | 300 | — | — | 306.77 微秒 |
| apscheduler | 64 | 2700 | — | — | 2.697 毫秒 |
| apscheduler | 64 | 10000 | — | — | 26.236 毫秒 |
| asyncio_pool | 1 | 40 | 94.60 微秒 | 65.83% | 49.11 微秒 |
| asyncio_pool | 1 | 300 | 105.10 微秒 | 26.35% | 293.77 微秒 |
| asyncio_pool | 1 | 2700 | 126.11 微秒 | 4.54% | 2.652 毫秒 |
| asyncio_pool | 1 | 10000 | 203.48 微秒 | 2.05% | 9.735 毫秒 |
| asyncio_pool | 4 | 40 | 101.32 微秒 | 65.20% | 54.08 微秒 |
| asyncio_pool | 4 | 300 | 106.75 微秒 | 26.02% | 303.47 微秒 |
| asyncio_pool | 4 | 2700 | 135.20 微秒 | 4.90% | 2.627 毫秒 |
| asyncio_pool | 4 | 10000 | — | — | 11.893 毫秒 |
| asyncio_pool | 16 | 40 | — | — | 54.43 微秒 |
| asyncio_pool | 16 | 300 | — | — | 305.14 微秒 |
| asyncio_pool | 16 | 2700 | — | — | 2.720 毫秒 |
| asyncio_pool | 16 | 10000 | — | — | 19.853 毫秒 |
| asyncio_pool | 64 | 40 | — | — | 52.71 微秒 |
| asyncio_pool | 64 | 300 | — | — | 296.74 微秒 |
| asyncio_pool | 64 | 2700 | — | — | 2.635 毫秒 |
| asyncio_pool | 64 | 10000 | — | — | 95.672 毫秒 |
| bare_thread | 1 | 40 | 96.58 微秒 | 64.64% | 52.83 微秒 |
| bare_thread | 1 | 300 | 105.26 微秒 | 26.00% | 299.62 微秒 |
| bare_thread | 1 | 2700 | 115.55 微秒 | 4.26% | 2.598 毫秒 |
| bare_thread | 1 | 10000 | 128.17 微秒 | 1.36% | 9.310 毫秒 |
| bare_thread | 4 | 40 | 109.36 微秒 | 68.16% | 51.09 微秒 |
| bare_thread | 4 | 300 | 123.57 微秒 | 29.31% | 297.99 微秒 |
| bare_thread | 4 | 2700 | 125.35 微秒 | 4.68% | 2.552 毫秒 |
| bare_thread | 4 | 10000 | — | — | 14.624 毫秒 |
| bare_thread | 16 | 40 | — | — | 51.20 微秒 |
| bare_thread | 16 | 300 | — | — | 302.31 微秒 |
| bare_thread | 16 | 2700 | — | — | 2.600 毫秒 |
| bare_thread | 16 | 10000 | — | — | 14.517 毫秒 |
| bare_thread | 64 | 40 | — | — | 51.67 微秒 |
| bare_thread | 64 | 300 | — | — | 296.28 微秒 |
| bare_thread | 64 | 2700 | — | — | 2.547 毫秒 |
| bare_thread | 64 | 10000 | — | — | 14.926 毫秒 |
| process_pool | 1 | 40 | 297.99 微秒 | 84.46% | 54.82 微秒 |
| process_pool | 1 | 300 | 296.42 微秒 | 49.83% | 298.41 微秒 |
| process_pool | 1 | 2700 | 338.48 微秒 | 11.47% | 2.612 毫秒 |
| process_pool | 1 | 10000 | 315.65 微秒 | 3.15% | 9.700 毫秒 |
| process_pool | 4 | 40 | 139.83 微秒 | 59.90% | 93.63 微秒 |
| process_pool | 4 | 300 | — | — | 570.65 微秒 |
| process_pool | 4 | 2700 | — | — | 4.811 毫秒 |
| process_pool | 4 | 10000 | — | — | 17.796 毫秒 |
| process_pool | 16 | 40 | — | — | 89.18 微秒 |
| process_pool | 16 | 300 | — | — | 566.98 微秒 |
| process_pool | 16 | 2700 | — | — | 9.350 毫秒 |
| process_pool | 16 | 10000 | — | — | 52.201 毫秒 |
| process_pool | 64 | 40 | — | — | 90.02 微秒 |
| process_pool | 64 | 300 | — | — | 578.40 微秒 |
| process_pool | 64 | 2700 | — | — | 27.348 毫秒 |
| process_pool | 64 | 10000 | — | — | 158.515 毫秒 |
| thread_pool | 1 | 40 | 30.69 微秒 | 40.53% | 45.03 微秒 |
| thread_pool | 1 | 300 | 40.23 微秒 | 12.18% | 289.95 微秒 |
| thread_pool | 1 | 2700 | 44.78 微秒 | 1.65% | 2.672 毫秒 |
| thread_pool | 1 | 10000 | 68.09 微秒 | 0.70% | 9.640 毫秒 |
| thread_pool | 4 | 40 | 46.24 微秒 | 48.10% | 49.90 微秒 |
| thread_pool | 4 | 300 | 56.54 微秒 | 15.90% | 299.17 微秒 |
| thread_pool | 4 | 2700 | 101.92 微秒 | 3.74% | 2.627 毫秒 |
| thread_pool | 4 | 10000 | — | — | 19.739 毫秒 |
| thread_pool | 16 | 40 | — | — | 47.80 微秒 |
| thread_pool | 16 | 300 | — | — | 294.69 微秒 |
| thread_pool | 16 | 2700 | — | — | 2.611 毫秒 |
| thread_pool | 16 | 10000 | — | — | 19.834 毫秒 |
| thread_pool | 64 | 40 | — | — | 47.57 微秒 |
| thread_pool | 64 | 300 | — | — | 286.81 微秒 |
| thread_pool | 64 | 2700 | — | — | 2.685 毫秒 |
| thread_pool | 64 | 10000 | — | — | 73.761 毫秒 |
| zoo | 1 | 40 | 130.73 微秒 | 71.79% | 51.38 微秒 |
| zoo | 1 | 300 | 170.02 微秒 | 43.97% | 216.63 微秒 |
| zoo | 1 | 2700 | 135.03 微秒 | 4.94% | 2.601 毫秒 |
| zoo | 1 | 10000 | 163.30 微秒 | 1.68% | 9.563 毫秒 |
| zoo | 4 | 40 | 149.36 微秒 | 73.41% | 54.09 微秒 |
| zoo | 4 | 300 | 157.75 微秒 | 33.89% | 307.66 微秒 |
| zoo | 4 | 2700 | 188.10 微秒 | 6.52% | 2.696 毫秒 |
| zoo | 4 | 10000 | — | — | 14.842 毫秒 |
| zoo | 16 | 40 | — | — | 53.93 微秒 |
| zoo | 16 | 300 | — | — | 304.16 微秒 |
| zoo | 16 | 2700 | — | — | 2.656 毫秒 |
| zoo | 16 | 10000 | — | — | 20.061 毫秒 |
| zoo | 64 | 40 | — | — | 53.82 微秒 |
| zoo | 64 | 300 | — | — | 308.19 微秒 |
| zoo | 64 | 2700 | — | — | 2.676 毫秒 |
| zoo | 64 | 10000 | — | — | 31.988 毫秒 |

### 附录：吞吐与并发伸缩

| 方案 | 并发度 | 执行体档位（微秒） | 吞吐（任务/秒） |
|---|---|---|---|
| apscheduler | 1 | 40 | 3417.8 |
| apscheduler | 1 | 300 | 1818.4 |
| apscheduler | 1 | 2700 | 334.3 |
| apscheduler | 1 | 10000 | 102.7 |
| apscheduler | 4 | 40 | 15108.5 |
| apscheduler | 4 | 300 | 7640.5 |
| apscheduler | 4 | 2700 | 1336.6 |
| apscheduler | 4 | 10000 | 403.3 |
| apscheduler | 16 | 40 | 65056.7 |
| apscheduler | 16 | 300 | 32533.3 |
| apscheduler | 16 | 2700 | 5405.6 |
| apscheduler | 16 | 10000 | 1567.5 |
| apscheduler | 64 | 40 | 284933.9 |
| apscheduler | 64 | 300 | 128790.1 |
| apscheduler | 64 | 2700 | 21617.7 |
| apscheduler | 64 | 10000 | 5986.5 |
| asyncio_pool | 1 | 40 | 6958.7 |
| asyncio_pool | 1 | 300 | 2507.1 |
| asyncio_pool | 1 | 2700 | 360.0 |
| asyncio_pool | 1 | 10000 | 100.6 |
| asyncio_pool | 4 | 40 | 25740.3 |
| asyncio_pool | 4 | 300 | 9750.8 |
| asyncio_pool | 4 | 2700 | 1448.3 |
| asyncio_pool | 4 | 10000 | 411.5 |
| asyncio_pool | 16 | 40 | 117388.0 |
| asyncio_pool | 16 | 300 | 40077.0 |
| asyncio_pool | 16 | 2700 | 5625.0 |
| asyncio_pool | 16 | 10000 | 1618.7 |
| asyncio_pool | 64 | 40 | 524166.3 |
| asyncio_pool | 64 | 300 | 168896.4 |
| asyncio_pool | 64 | 2700 | 23239.8 |
| asyncio_pool | 64 | 10000 | 6178.8 |
| bare_thread | 1 | 40 | 6693.0 |
| bare_thread | 1 | 300 | 2469.9 |
| bare_thread | 1 | 2700 | 368.5 |
| bare_thread | 1 | 10000 | 106.0 |
| bare_thread | 4 | 40 | 24929.6 |
| bare_thread | 4 | 300 | 9488.5 |
| bare_thread | 4 | 2700 | 1494.0 |
| bare_thread | 4 | 10000 | 413.5 |
| bare_thread | 16 | 40 | 93609.9 |
| bare_thread | 16 | 300 | 36890.8 |
| bare_thread | 16 | 2700 | 5852.3 |
| bare_thread | 16 | 10000 | 1681.6 |
| bare_thread | 64 | 40 | 374656.8 |
| bare_thread | 64 | 300 | 149637.7 |
| bare_thread | 64 | 2700 | 23821.1 |
| bare_thread | 64 | 10000 | 6529.1 |
| process_pool | 1 | 40 | 2834.3 |
| process_pool | 1 | 300 | 1681.2 |
| process_pool | 1 | 2700 | 338.9 |
| process_pool | 1 | 10000 | 99.8 |
| process_pool | 4 | 40 | 17133.9 |
| process_pool | 4 | 300 | 13636.3 |
| process_pool | 4 | 2700 | 2880.3 |
| process_pool | 4 | 10000 | 866.3 |
| process_pool | 16 | 40 | 101836.3 |
| process_pool | 16 | 300 | 56477.9 |
| process_pool | 16 | 2700 | 11185.9 |
| process_pool | 16 | 10000 | 3371.6 |
| process_pool | 64 | 40 | 333912.8 |
| process_pool | 64 | 300 | 212933.5 |
| process_pool | 64 | 2700 | 46518.2 |
| process_pool | 64 | 10000 | 13825.1 |
| thread_pool | 1 | 40 | 13207.1 |
| thread_pool | 1 | 300 | 3028.6 |
| thread_pool | 1 | 2700 | 368.0 |
| thread_pool | 1 | 10000 | 103.0 |
| thread_pool | 4 | 40 | 41606.5 |
| thread_pool | 4 | 300 | 11245.1 |
| thread_pool | 4 | 2700 | 1465.9 |
| thread_pool | 4 | 10000 | 409.9 |
| thread_pool | 16 | 40 | 175734.6 |
| thread_pool | 16 | 300 | 46210.8 |
| thread_pool | 16 | 2700 | 5909.9 |
| thread_pool | 16 | 10000 | 1652.9 |
| thread_pool | 64 | 40 | 707233.4 |
| thread_pool | 64 | 300 | 186277.5 |
| thread_pool | 64 | 2700 | 23134.1 |
| thread_pool | 64 | 10000 | 6155.4 |
| zoo | 1 | 40 | 5491.5 |
| zoo | 1 | 300 | 2586.3 |
| zoo | 1 | 2700 | 365.5 |
| zoo | 1 | 10000 | 102.8 |
| zoo | 4 | 40 | 19661.0 |
| zoo | 4 | 300 | 8594.6 |
| zoo | 4 | 2700 | 1387.0 |
| zoo | 4 | 10000 | 399.4 |
| zoo | 16 | 40 | 77474.6 |
| zoo | 16 | 300 | 34528.5 |
| zoo | 16 | 2700 | 5565.2 |
| zoo | 16 | 10000 | 1576.5 |
| zoo | 64 | 40 | 313716.1 |
| zoo | 64 | 300 | 135978.9 |
| zoo | 64 | 2700 | 22138.1 |
| zoo | 64 | 10000 | 6232.3 |
