zoo-bench · 2026-10-11 · AMD EPYC 7763 64-Core Processor
与 apscheduler、asyncio_pool、bare_thread、process_pool、thread_pool 共 5 个对照方案的同口径对比;全部数值由 zoo-bench 在本机重新测量、逐档公开,包括本框架输掉的档位。
原始数据:results/zoo-framework-dev/20261011T094251Z.json
zoo-bench 报告
| 项 | 值 |
|---|---|
| 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.11.2-beta |
| 被测框架(模块 __version__) | 0.11.2-beta(仅附注,不作版本判据) |
| 被测框架的驱动面世代 | 当前代驱动面(调度内核 core + 调度模型 model,完成信号取自结果响应器) |
| 安装来源 | git 的 dev |
| 提交 | 44dcbca5f392 |
| harness | zoo-bench 0.0.1 @ 9a42be24ac43f75e2e5d7b16434f91ba3d0717b6 |
数据:运行环境
运行环境
| 项 | 值 |
|---|---|
| 复现命令 | zoo-bench run --framework zoo-framework @ git+https://github.com/YearsAlso/zoo-framework.git@dev |
以 dist_version(发行元数据)为版本真源;module_version 仅作附注
数据:运行环境
zoo-bench 报告
数据:负载
zoo-bench 报告
数据:测量口径
zoo-bench 报告
数据:结论摘要
结论摘要
数据:结论摘要
结论摘要
幻灯片为了「一页一个结论」只放了本章的前 2 页;余下 6 页的逐单元数值、分位数与原始样本都在全文的同一章节里,逐字可核。
全文:同目录 report.md 的「结论摘要」章节
结论摘要 · 框架自身开销占比
执行体 10000 微秒 时,zoo 的框架自身开销占比。
该档位有 2 个方案更低:bare_thread、thread_pool。
同档对比:apscheduler 3.50%、asyncio_pool 1.71%、bare_thread 1.36%、process_pool 3.65%、thread_pool 0.60%
数据:zoo-bench「框架自身开销占比」· 并发度 1 · 执行体 10000 微秒 档
维度:延迟分位数与抖动
并发度 1 · 端到端 / 并发度
数据:zoo-bench「延迟分位数与抖动」· 并发度 1 · 逐单元数值与分位数见 report.md 的同一章节
维度:延迟分位数与抖动
并发度 1 · 端到端 / 并发度
数据:zoo-bench「延迟分位数与抖动」· 并发度 1 · 逐单元数值与分位数见 report.md 的同一章节
zoo-bench 报告
端到端 / 并发度;分位数与相对离散度同表给出,只给中位数的度量不合格
| 并发度 | 执行体档位(微秒) | zoo | apscheduler | asyncio_pool | bare_thread | process_pool | thread_pool |
|---|---|---|---|---|---|---|---|
| 1 | 40 | 151.05 微秒 | 287.86 微秒 | 142.30 微秒 | 145.22 微秒 | 349.41 微秒 | 75.73 微秒 |
| 1 | 300 | 410.28 微秒 | 553.65 微秒 | 385.12 微秒 | 388.13 微秒 | 590.88 微秒 | 313.96 微秒 |
| 1 | 2700 | 2.753 毫秒 | 2.987 毫秒 | 2.699 毫秒 | 2.634 毫秒 | 2.988 毫秒 | 2.667 毫秒 |
| 1 | 10000 | 9.871 毫秒 | 9.941 毫秒 | 9.474 毫秒 | 9.553 毫秒 | 9.773 毫秒 | 9.525 毫秒 |
| 4 | 40 | 174.59 微秒 | 252.70 微秒 | 162.47 微秒 | 158.14 微秒 | 167.32 微秒 | 97.54 微秒 |
| 4 | 300 | 449.42 微秒 | 521.58 微秒 | 422.43 微秒 | 412.54 微秒 | 306.62 微秒 | 346.42 微秒 |
| 4 | 2700 | 2.911 毫秒 | 2.912 毫秒 | 2.754 毫秒 | 2.683 毫秒 | 1.390 毫秒 | 2.689 毫秒 |
| 4 | 10000 | 9.949 毫秒 | 9.993 毫秒 | 9.670 毫秒 | 9.713 毫秒 | 4.653 毫秒 | 9.529 毫秒 |
| 16 | 40 | 177.55 微秒 | 229.36 微秒 | 133.81 微秒 | 171.28 微秒 | 156.46 微秒 | 90.20 微秒 |
| 16 | 300 | 466.12 微秒 | 505.80 微秒 | 396.45 微秒 | 423.99 微秒 | 275.04 微秒 | 345.34 微秒 |
| 16 | 2700 | 2.908 毫秒 | 2.947 毫秒 | 2.770 毫秒 | 2.705 毫秒 | 1.381 毫秒 | 2.740 毫秒 |
数据:维度:延迟分位数与抖动
维度:延迟分位数与抖动
| 并发度 | 执行体档位(微秒) | zoo | apscheduler | asyncio_pool | bare_thread | process_pool | thread_pool |
|---|---|---|---|---|---|---|---|
| 16 | 10000 | 10.146 毫秒 | 10.216 毫秒 | 9.917 毫秒 | 9.716 毫秒 | 4.712 毫秒 | 9.785 毫秒 |
| 64 | 40 | 205.09 微秒 | 221.11 微秒 | 121.88 微秒 | 170.85 微秒 | 204.14 微秒 | 91.39 微秒 |
| 64 | 300 | 462.64 微秒 | 509.59 微秒 | 381.72 微秒 | 425.01 微秒 | 307.25 微秒 | 352.74 微秒 |
| 64 | 2700 | 2.884 毫秒 | 2.905 毫秒 | 2.779 毫秒 | 2.746 毫秒 | 1.379 毫秒 | 2.647 毫秒 |
| 64 | 10000 | 10.447 毫秒 | 10.197 毫秒 | 9.811 毫秒 | 9.532 毫秒 | 4.713 毫秒 | 10.238 毫秒 |
逐单元数值(分位数、离散度、各轮原始样本)见文末「附录:全部数值」。
数据:维度:延迟分位数与抖动
维度:框架自身开销占比
并发度 1 · 框架自身开销
数据:zoo-bench「框架自身开销占比」· 并发度 1 · 逐单元数值与分位数见 report.md 的同一章节
维度:框架自身开销占比
并发度 1 · 框架自身开销
数据:zoo-bench「框架自身开销占比」· 并发度 1 · 逐单元数值与分位数见 report.md 的同一章节
zoo-bench 报告
开销 = 端到端/并发度 - 同一次运行内实测的执行体耗时(不做跨运行减法)。带 — 的格:该并发度超出这台机器的并行能力,执行体自报耗时含超订的调度等待,与该行的每任务端到端不可比,故不给开销数字(端到端与吞吐见各自的维度)
| 并发度 | 执行体档位(微秒) | zoo | apscheduler | asyncio_pool | bare_thread | process_pool | thread_pool |
|---|---|---|---|---|---|---|---|
| 1 | 40 | 67.93% | 82.43% | 67.30% | 64.62% | 84.22% | 41.18% |
| 1 | 300 | 28.03% | 45.95% | 27.77% | 26.48% | 49.33% | 11.25% |
| 1 | 2700 | 5.00% | 9.52% | 4.39% | 4.23% | 11.32% | 1.80% |
| 1 | 10000 | 1.63% | 3.50% | 1.71% | 1.36% | 3.65% | 0.60% |
| 4 | 40 | 72.39% | 77.98% | 67.61% | 68.53% | 43.29% | 48.41% |
| 4 | 300 | 33.16% | 40.01% | 26.84% | 27.97% | — | 15.15% |
| 4 | 2700 | 6.07% | 9.25% | 5.48% | 4.89% | — | 3.51% |
| 4 | 10000 | — | — | — | — | — | — |
| 16 | 40 | — | — | — | — | — | — |
| 16 | 300 | — | — | — | — | — | — |
| 16 | 2700 | — | — | — | — | — | — |
数据:维度:框架自身开销占比
维度:框架自身开销占比
| 并发度 | 执行体档位(微秒) | zoo | apscheduler | asyncio_pool | bare_thread | process_pool | thread_pool |
|---|---|---|---|---|---|---|---|
| 16 | 10000 | — | — | — | — | — | — |
| 64 | 40 | — | — | — | — | — | — |
| 64 | 300 | — | — | — | — | — | — |
| 64 | 2700 | — | — | — | — | — | — |
| 64 | 10000 | — | — | — | — | — | — |
逐单元数值(分位数、离散度、各轮原始样本)见文末「附录:全部数值」。
数据:维度:框架自身开销占比
维度:吞吐与并发伸缩
并发度 1 · 吞吐
数据:zoo-bench「吞吐与并发伸缩」· 并发度 1 · 逐单元数值与分位数见 report.md 的同一章节
维度:吞吐与并发伸缩
并发度 1 · 吞吐
数据:zoo-bench「吞吐与并发伸缩」· 并发度 1 · 逐单元数值与分位数见 report.md 的同一章节
zoo-bench 报告
吞吐 = 并发度 / 端到端中位数;随并发度是否继续上升即为伸缩性
| 并发度 | 执行体档位(微秒) | zoo | apscheduler | asyncio_pool | bare_thread | process_pool | thread_pool |
|---|---|---|---|---|---|---|---|
| 1 | 40 | 6620.4 | 3473.9 | 7027.6 | 6886.0 | 2862.0 | 13204.5 |
| 1 | 300 | 2437.4 | 1806.2 | 2596.6 | 2576.4 | 1692.4 | 3185.1 |
| 1 | 2700 | 363.2 | 334.8 | 370.4 | 379.6 | 334.6 | 375.0 |
| 1 | 10000 | 101.3 | 100.6 | 105.5 | 104.7 | 102.3 | 105.0 |
| 4 | 40 | 22910.9 | 15828.8 | 24620.6 | 25293.9 | 23906.0 | 41009.0 |
| 4 | 300 | 8900.3 | 7669.0 | 9468.9 | 9696.1 | 13045.3 | 11546.7 |
| 4 | 2700 | 1374.2 | 1373.4 | 1452.5 | 1491.0 | 2878.5 | 1487.4 |
| 4 | 10000 | 402.1 | 400.3 | 413.6 | 411.8 | 859.6 | 419.8 |
| 16 | 40 | 90116.9 | 69759.2 | 119571.2 | 93414.7 | 102262.4 | 177375.4 |
| 16 | 300 | 34326.2 | 31632.8 | 40357.7 | 37737.0 | 58172.4 | 46331.7 |
| 16 | 2700 | 5501.6 | 5429.2 | 5775.3 | 5915.8 | 11588.2 | 5838.4 |
数据:维度:吞吐与并发伸缩
维度:吞吐与并发伸缩
| 并发度 | 执行体档位(微秒) | zoo | apscheduler | asyncio_pool | bare_thread | process_pool | thread_pool |
|---|---|---|---|---|---|---|---|
| 16 | 10000 | 1577.0 | 1566.2 | 1613.4 | 1646.8 | 3395.6 | 1635.2 |
| 64 | 40 | 312054.2 | 289446.9 | 525124.2 | 374606.5 | 313503.0 | 700311.8 |
| 64 | 300 | 138336.3 | 125590.4 | 167662.6 | 150584.2 | 208301.1 | 181435.9 |
| 64 | 2700 | 22191.3 | 22031.0 | 23032.2 | 23310.3 | 46410.5 | 24173.8 |
| 64 | 10000 | 6126.4 | 6276.1 | 6523.5 | 6714.2 | 13578.0 | 6251.0 |
逐单元数值(分位数、离散度、各轮原始样本)见文末「附录:全部数值」。
数据:维度:吞吐与并发伸缩
zoo-bench 报告
口径:把每任务端到端拆成提交侧 / 手交 / 执行体 / 回程四段,并在同一档位与并发度下与各对照方案逐段对照,回答「超出对照的部分落在哪一段」。它是诊断而非主证据:抽样一小批档位,且不与对照方案比总开销。手交为负不是错误:那表示提交调用还没返回、执行体就已经开跑——把建线程一类工作算进提交侧的方案就会这样(实测 bare_thread 手交 -343 微秒)。回程含完成信号的等待(排空返回前的最后一段),它与主测量是同一口径
状态:ok
本维度是诊断不是主证据:抽样的档位与并发度固定为一小批,不覆盖矩阵里的全部单元。并发度上界取机器的并行能力——超过它时量到的是争用;
抽样档位(微秒):40、10000;并发度:[1, 4];该机器并行能力:4
| 方案 | 并发度 | 档位(微秒) | 提交侧 | 手交 | 执行体 | 回程 | 状态 |
|---|---|---|---|---|---|---|---|
| apscheduler | 1 | 40 | 108.63 微秒 | 91.69 微秒 | 50.72 微秒 | 40.59 微秒 | ok |
| apscheduler | 4 | 40 | 109.96 微秒 | 509.17 微秒 | 53.33 微秒 | 229.15 微秒 | ok |
| apscheduler | 1 | 10000 | 165.03 微秒 | 115.08 微秒 | 9.620 毫秒 | 54.23 微秒 | ok |
数据:维度:开销归因
维度:开销归因
| 方案 | 并发度 | 档位(微秒) | 提交侧 | 手交 | 执行体 | 回程 | 状态 |
|---|---|---|---|---|---|---|---|
| apscheduler | 4 | 10000 | 124.65 微秒 | 10.534 毫秒 | 14.747 毫秒 | 9.563 毫秒 | ok |
| asyncio_pool | 1 | 40 | 17.86 微秒 | 27.78 微秒 | 46.74 微秒 | 61.41 微秒 | ok |
| asyncio_pool | 4 | 40 | 19.51 微秒 | 277.63 微秒 | 56.04 微秒 | 298.30 微秒 | ok |
| asyncio_pool | 1 | 10000 | 24.40 微秒 | 38.13 微秒 | 9.282 毫秒 | 88.21 微秒 | ok |
| asyncio_pool | 4 | 10000 | 23.24 微秒 | 12.312 毫秒 | 14.438 毫秒 | 9.637 毫秒 | ok |
| bare_thread | 1 | 40 | 142.97 微秒 | -77.02 微秒 | 53.08 微秒 | 31.00 微秒 | ok |
| bare_thread | 4 | 40 | 156.85 微秒 | -76.12 微秒 | 51.67 微秒 | 320.79 微秒 | ok |
| bare_thread | 1 | 10000 | 5.183 毫秒 | -5103.28 微秒 | 9.413 毫秒 | 40.28 微秒 | ok |
| bare_thread | 4 | 10000 | 5.193 毫秒 | -5086.31 微秒 | 14.456 毫秒 | 9.546 毫秒 | 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:执行体的起止时刻读不到——它没有在本进程里运行(跨进程档位无法这样分段) |
数据:维度:开销归因
维度:开销归因
幻灯片为了「一页一个结论」只放了本章的前 2 页;余下 9 页的逐单元数值、分位数与原始样本都在全文的同一章节里,逐字可核。
全文:同目录 report.md 的「维度:开销归因」章节
zoo-bench 报告
口径:本维度采用内部开关对照(同一 workload 下语义全关 vs 逐个开启),不与对照方案横向比较——裸写法没有优先级/超时/重试的对应物,故只能回答“本框架的语义值多少钱”,不能回答“比裸写法贵多少”
状态:ok(结论在该次测量装着的「current」代驱动面上得出)
| 语义项 | 层级 | 探查方式 | 可测 | 证据 / 原因 |
|---|---|---|---|---|
| 超时 | 派发层 | 行为探查(按调度轮反复驱动,量在飞表摘除时刻) | 是 | 已观测到超时摘除:在执行体结束之前离开在飞表(0.0122s)(执行体 0.15s、run_timeout 0.01s);判定动作在 dispatch_core.py:472;生效的是观测与熔断(记录、标记不健康、摘除在飞登记、停止派发),不是终止仍在执行的 worker——CPython 无法安全中断线程 |
| 优先级 | 事件层 | 结构探查(检查执行所需的符号是否存在) | 否 | 未复核:本项的结论是在「previous」代上得出的,把它当成本代的事实等于在报告里断言一个当前代并不具备的接线。重新推导需要单独一次探查设计(每项要有干净的开/关态才谈得上定价) |
| 重试 | 事件层 | 结构探查(检查执行所需的符号是否存在) | 否 | 未复核:本项的结论是在「previous」代上得出的,把它当成本代的事实等于在报告里断言一个当前代并不具备的接线。重新推导需要单独一次探查设计(每项要有干净的开/关态才谈得上定价) |
本结论按被测版本得出,坐标只对该版本成立;往 matrix.yaml 追加版本后须重跑本探查
数据:维度:调度语义的代价
zoo-bench 报告
口径:该线独立测量:它不进入主矩阵的透视表与交叉点,其数值也不可与那些表里的对照方案横向比较
该线结论:ok
等价性门禁:通过,15 条判据输入与 Python 参照逐字节比对(输入上限 256 字节)
所测任务 modbus_rtu.parse_response——Modbus RTU 响应帧解析:输入是一条裸 RTU ADU 响应帧(不含任何传输层封装),其长度即该档位的帧字节
规模档位 R1、R8、R125(帧字节 7、21、255);并发度 1、4、16、64;每格预热 100 轮 + 采样 100 轮,每个并发度一个子进程(共 4 个)
规模分界(只在判定并发度 1 上判读):原生形态更快的档位:R8、R125;更慢的档位:R1;分辨不出的档位:无。分界点:帧不超过 7 字节时原生形态不快,达到或超过 21 字节时更快
每个数值是每任务端到端(正式采样轮的中位数)——与主矩阵延迟维度同一口径
数据:维度:原生任务线:同一被测对象的三种执行形态
维度:原生任务线:同一被测对象的三种执行形态
| 档位(微秒) | 帧字节 | 并发度 | 纯解释 | 原生扩展 | 在线路由 | 原生扩展 / 纯解释 | 在线路由 / 纯解释 | 更快的一方 |
|---|---|---|---|---|---|---|---|---|
| R1 | 7 | 1 | 189.78 微秒 | 192.82 微秒 | 239.17 微秒 | 1.02x | 1.26x | 纯解释 |
| R1 | 7 | 4 | 260.82 微秒 | 268.30 微秒 | 277.48 微秒 | 1.03x | 1.06x | 纯解释 |
| R1 | 7 | 16 | 255.22 微秒 | 264.64 微秒 | 275.81 微秒 | 1.04x | 1.08x | 纯解释 |
| R1 | 7 | 64 | 257.22 微秒 | 266.34 微秒 | 282.83 微秒 | 1.04x | 1.10x | 未决 |
| R8 | 21 | 1 | 216.56 微秒 | 205.28 微秒 | 258.46 微秒 | 0.95x | 1.19x | 原生扩展 |
| R8 | 21 | 4 | 291.65 微秒 | 271.99 微秒 | 304.52 微秒 | 0.93x | 1.04x | 未决 |
| R8 | 21 | 16 | 284.36 微秒 | 278.61 微秒 | 303.14 微秒 | 0.98x | 1.07x | 未决 |
| R8 | 21 | 64 | 282.44 微秒 | 281.62 微秒 | 307.27 微秒 | 1.00x | 1.09x | 未决 |
| R125 | 255 | 1 | 643.52 微秒 | 410.37 微秒 | 470.20 微秒 | 0.64x | 0.73x | 原生扩展 |
| R125 | 255 | 4 | 698.27 微秒 | 495.83 微秒 | 515.80 微秒 | 0.71x | 0.74x | 原生扩展 |
| R125 | 255 | 16 | 688.63 微秒 | 498.11 微秒 | 516.04 微秒 | 0.72x | 0.75x | 原生扩展 |
| R125 | 255 | 64 | 675.87 微秒 | 497.24 微秒 | 525.11 微秒 | 0.74x | 0.78x | 原生扩展 |
数据:维度:原生任务线:同一被测对象的三种执行形态
维度:原生任务线:同一被测对象的三种执行形态
幻灯片为了「一页一个结论」只放了本章的前 2 页;余下 2 页的逐单元数值、分位数与原始样本都在全文的同一章节里,逐字可核。
全文:同目录 report.md 的「维度:原生任务线:同一被测对象的三种执行形态」章节
zoo-bench 报告
被测框架处于优势的档位(两侧差异大于该档位的带宽)。它与「公开的不利数据」出自同一份同运行内的相对比,只是一个取更快的、一个取更慢的——两者的覆盖面相同,故谁都挑不了档位。本节的缺席不构成不合格:分不出胜负或处处更慢时它就应当是空的
| 对照方案 | 并发度 | 执行体档位(微秒) | 差距 | 被测框架中位数 |
|---|---|---|---|---|
| apscheduler | 1 | 40 | 被测框架比 apscheduler 快 1.91x | 151.05 微秒 |
| process_pool | 1 | 40 | 被测框架比 process_pool 快 2.31x | 151.05 微秒 |
| apscheduler | 1 | 300 | 被测框架比 apscheduler 快 1.35x | 410.28 微秒 |
| process_pool | 1 | 300 | 被测框架比 process_pool 快 1.44x | 410.28 微秒 |
| apscheduler | 1 | 2700 | 被测框架比 apscheduler 快 1.08x | 2.753 毫秒 |
| process_pool | 1 | 2700 | 被测框架比 process_pool 快 1.09x | 2.753 毫秒 |
| apscheduler | 4 | 40 | 被测框架比 apscheduler 快 1.45x | 174.59 微秒 |
| apscheduler | 4 | 300 | 被测框架比 apscheduler 快 1.16x | 449.42 微秒 |
| apscheduler | 16 | 40 | 被测框架比 apscheduler 快 1.29x | 177.55 微秒 |
| apscheduler | 16 | 300 | 被测框架比 apscheduler 快 1.09x | 466.12 微秒 |
| apscheduler | 64 | 300 | 被测框架比 apscheduler 快 1.10x | 462.64 微秒 |
数据:被测框架在哪些档位更快
公开的不利数据 · 归类
最差 1.68x(并发 64 · 40 微秒)。全部档位:并发 1 · 10000 微秒、并发 4 · 2700 微秒、并发 4 · 10000 微秒、并发 16 · 40 微秒、并发 16 · 300 微秒、并发 16 · 2700 微秒、并发 64 · 40 微秒、并发 64 · 300 微秒、并发 64 · 2700 微秒、并发 64 · 10000 微秒
最差 1.20x(并发 64 · 40 微秒)。全部档位:并发 1 · 2700 微秒、并发 1 · 10000 微秒、并发 4 · 300 微秒、并发 4 · 2700 微秒、并发 4 · 10000 微秒、并发 16 · 300 微秒、并发 16 · 2700 微秒、并发 16 · 10000 微秒、并发 64 · 40 微秒、并发 64 · 300 微秒、并发 64 · 2700 微秒、并发 64 · 10000 微秒
最差 2.22x(并发 64 · 10000 微秒)。全部档位:并发 4 · 300 微秒、并发 4 · 2700 微秒、并发 4 · 10000 微秒、并发 16 · 300 微秒、并发 16 · 2700 微秒、并发 16 · 10000 微秒、并发 64 · 300 微秒、并发 64 · 2700 微秒、并发 64 · 10000 微秒
最差 2.24x(并发 64 · 40 微秒)。全部档位:并发 1 · 40 微秒、并发 1 · 300 微秒、并发 1 · 10000 微秒、并发 4 · 40 微秒、并发 4 · 300 微秒、并发 4 · 2700 微秒、并发 4 · 10000 微秒、并发 16 · 40 微秒、并发 16 · 300 微秒、并发 16 · 2700 微秒、并发 16 · 10000 微秒、并发 64 · 40 微秒、并发 64 · 300 微秒、并发 64 · 2700 微秒
数据:zoo-bench「公开的不利数据」· 逐档明细见其后的页与 report.md
zoo-bench 报告
被测框架处于劣势的档位(两侧差异大于该档位的带宽)。这部分缺失的报告不合格——一份只展示自己赢的报告,读者有理由认为它不可信。差异小于带宽的档位不在本节,而在「分不出胜负」那一节:那是判据的结果,不是把它们藏起来
| 对照方案 | 并发度 | 执行体档位(微秒) | 差距 | 被测框架中位数 |
|---|---|---|---|---|
| thread_pool | 1 | 40 | thread_pool 比 zoo 快 1.99x | 151.05 微秒 |
| thread_pool | 1 | 300 | thread_pool 比 zoo 快 1.31x | 410.28 微秒 |
| bare_thread | 1 | 2700 | bare_thread 比 zoo 快 1.05x | 2.753 毫秒 |
| asyncio_pool | 1 | 10000 | asyncio_pool 比 zoo 快 1.04x | 9.871 毫秒 |
| bare_thread | 1 | 10000 | bare_thread 比 zoo 快 1.03x | 9.871 毫秒 |
| thread_pool | 1 | 10000 | thread_pool 比 zoo 快 1.04x | 9.871 毫秒 |
| thread_pool | 4 | 40 | thread_pool 比 zoo 快 1.79x | 174.59 微秒 |
| bare_thread | 4 | 300 | bare_thread 比 zoo 快 1.09x | 449.42 微秒 |
| process_pool | 4 | 300 | process_pool 比 zoo 快 1.47x | 449.42 微秒 |
| thread_pool | 4 | 300 | thread_pool 比 zoo 快 1.30x | 449.42 微秒 |
| asyncio_pool | 4 | 2700 | asyncio_pool 比 zoo 快 1.06x | 2.911 毫秒 |
数据:公开的不利数据
公开的不利数据
| 对照方案 | 并发度 | 执行体档位(微秒) | 差距 | 被测框架中位数 |
|---|---|---|---|---|
| bare_thread | 4 | 2700 | bare_thread 比 zoo 快 1.09x | 2.911 毫秒 |
| process_pool | 4 | 2700 | process_pool 比 zoo 快 2.09x | 2.911 毫秒 |
| thread_pool | 4 | 2700 | thread_pool 比 zoo 快 1.08x | 2.911 毫秒 |
| asyncio_pool | 4 | 10000 | asyncio_pool 比 zoo 快 1.03x | 9.949 毫秒 |
| bare_thread | 4 | 10000 | bare_thread 比 zoo 快 1.02x | 9.949 毫秒 |
| process_pool | 4 | 10000 | process_pool 比 zoo 快 2.14x | 9.949 毫秒 |
| thread_pool | 4 | 10000 | thread_pool 比 zoo 快 1.04x | 9.949 毫秒 |
| asyncio_pool | 16 | 40 | asyncio_pool 比 zoo 快 1.33x | 177.55 微秒 |
| thread_pool | 16 | 40 | thread_pool 比 zoo 快 1.97x | 177.55 微秒 |
| asyncio_pool | 16 | 300 | asyncio_pool 比 zoo 快 1.18x | 466.12 微秒 |
| bare_thread | 16 | 300 | bare_thread 比 zoo 快 1.10x | 466.12 微秒 |
| process_pool | 16 | 300 | process_pool 比 zoo 快 1.69x | 466.12 微秒 |
| thread_pool | 16 | 300 | thread_pool 比 zoo 快 1.35x | 466.12 微秒 |
数据:公开的不利数据
公开的不利数据
| 对照方案 | 并发度 | 执行体档位(微秒) | 差距 | 被测框架中位数 |
|---|---|---|---|---|
| asyncio_pool | 16 | 2700 | asyncio_pool 比 zoo 快 1.05x | 2.908 毫秒 |
| bare_thread | 16 | 2700 | bare_thread 比 zoo 快 1.08x | 2.908 毫秒 |
| process_pool | 16 | 2700 | process_pool 比 zoo 快 2.11x | 2.908 毫秒 |
| thread_pool | 16 | 2700 | thread_pool 比 zoo 快 1.06x | 2.908 毫秒 |
| bare_thread | 16 | 10000 | bare_thread 比 zoo 快 1.04x | 10.146 毫秒 |
| process_pool | 16 | 10000 | process_pool 比 zoo 快 2.15x | 10.146 毫秒 |
| thread_pool | 16 | 10000 | thread_pool 比 zoo 快 1.04x | 10.146 毫秒 |
| asyncio_pool | 64 | 40 | asyncio_pool 比 zoo 快 1.68x | 205.09 微秒 |
| bare_thread | 64 | 40 | bare_thread 比 zoo 快 1.20x | 205.09 微秒 |
| thread_pool | 64 | 40 | thread_pool 比 zoo 快 2.24x | 205.09 微秒 |
| asyncio_pool | 64 | 300 | asyncio_pool 比 zoo 快 1.21x | 462.64 微秒 |
| bare_thread | 64 | 300 | bare_thread 比 zoo 快 1.09x | 462.64 微秒 |
| process_pool | 64 | 300 | process_pool 比 zoo 快 1.51x | 462.64 微秒 |
数据:公开的不利数据
公开的不利数据
| 对照方案 | 并发度 | 执行体档位(微秒) | 差距 | 被测框架中位数 |
|---|---|---|---|---|
| thread_pool | 64 | 300 | thread_pool 比 zoo 快 1.31x | 462.64 微秒 |
| asyncio_pool | 64 | 2700 | asyncio_pool 比 zoo 快 1.04x | 2.884 毫秒 |
| bare_thread | 64 | 2700 | bare_thread 比 zoo 快 1.05x | 2.884 毫秒 |
| process_pool | 64 | 2700 | process_pool 比 zoo 快 2.09x | 2.884 毫秒 |
| thread_pool | 64 | 2700 | thread_pool 比 zoo 快 1.09x | 2.884 毫秒 |
| asyncio_pool | 64 | 10000 | asyncio_pool 比 zoo 快 1.06x | 10.447 毫秒 |
| bare_thread | 64 | 10000 | bare_thread 比 zoo 快 1.10x | 10.447 毫秒 |
| process_pool | 64 | 10000 | process_pool 比 zoo 快 2.22x | 10.447 毫秒 |
原生任务线是独立的一条线,不与上表混读:在它的判定并发度 1 上,原生形态更慢的档位:R1;路由形态慢于纯解释形态的档位:R1、R8;两者都在「原生任务线:同一被测对象的三种执行形态」一节内与有利档位对等列出,出自同一轮同一份配对差
数据:公开的不利数据
zoo-bench 报告
两侧分不出胜负的档位:差异小于该档位的带宽。带宽取自同一次运行内两侧各自的跨轮离散度(每任务中位数的标准差 / 中位数)之和,故它随样本变化,读者可用留档里的逐轮样本自行复核。它同样覆盖全部所测档位、逐项写明原因——本节不是藏东西的地方:把噪声级差异报成「快 1.00x」才是
判据:带宽 = 被测框架侧与对照侧各自的跨轮相对离散度之和;单侧的跨轮相对离散度 = 该单元逐轮的「每任务中位数」的标准差 / 中位数
本期带宽:1.3% 到 50.0%(随各档位的离散度不同而不同)。
| 对照方案 | 并发度 | 执行体档位(微秒) | 比值 | 原因 |
|---|---|---|---|---|
| asyncio_pool | 1 | 40 | 0.94x | 两侧差异 5.8% 小于带宽 19.9%,分不出胜负 |
| bare_thread | 1 | 40 | 0.96x | 两侧差异 3.9% 小于带宽 19.5%,分不出胜负 |
| asyncio_pool | 1 | 300 | 0.94x | 两侧差异 6.1% 小于带宽 7.9%,分不出胜负 |
| bare_thread | 1 | 300 | 0.95x | 两侧差异 5.4% 小于带宽 7.7%,分不出胜负 |
| asyncio_pool | 1 | 2700 | 0.98x | 两侧差异 2.0% 小于带宽 3.2%,分不出胜负 |
| thread_pool | 1 | 2700 | 0.97x | 两侧差异 3.2% 小于带宽 3.4%,分不出胜负 |
数据:分不出胜负的档位
分不出胜负的档位
| 对照方案 | 并发度 | 执行体档位(微秒) | 比值 | 原因 |
|---|---|---|---|---|
| apscheduler | 1 | 10000 | 1.01x | 两侧差异 0.7% 小于带宽 1.3%,分不出胜负 |
| process_pool | 1 | 10000 | 0.99x | 两侧差异 1.0% 小于带宽 2.6%,分不出胜负 |
| asyncio_pool | 4 | 40 | 0.93x | 两侧差异 6.9% 小于带宽 21.6%,分不出胜负 |
| bare_thread | 4 | 40 | 0.91x | 两侧差异 9.4% 小于带宽 13.9%,分不出胜负 |
| process_pool | 4 | 40 | 0.96x | 两侧差异 4.2% 小于带宽 31.7%,分不出胜负 |
| asyncio_pool | 4 | 300 | 0.94x | 两侧差异 6.0% 小于带宽 7.6%,分不出胜负 |
| apscheduler | 4 | 2700 | 1.00x | 两侧差异 0.1% 小于带宽 2.4%,分不出胜负 |
| apscheduler | 4 | 10000 | 1.00x | 两侧差异 0.4% 小于带宽 1.7%,分不出胜负 |
| bare_thread | 16 | 40 | 0.96x | 两侧差异 3.5% 小于带宽 14.8%,分不出胜负 |
| process_pool | 16 | 40 | 0.88x | 两侧差异 11.9% 小于带宽 27.7%,分不出胜负 |
| apscheduler | 16 | 2700 | 1.01x | 两侧差异 1.3% 小于带宽 2.4%,分不出胜负 |
| apscheduler | 16 | 10000 | 1.01x | 两侧差异 0.7% 小于带宽 1.8%,分不出胜负 |
| asyncio_pool | 16 | 10000 | 0.98x | 两侧差异 2.3% 小于带宽 3.0%,分不出胜负 |
数据:分不出胜负的档位
分不出胜负的档位
幻灯片为了「一页一个结论」只放了本章的前 2 页;余下 1 页的逐单元数值、分位数与原始样本都在全文的同一章节里,逐字可核。
全文:同目录 report.md 的「分不出胜负的档位」章节
zoo-bench 报告
数据:口径局限与偏差来源
口径局限与偏差来源
绝对耗时:仅在同一次运行内部有效,不可跨运行比较
数据:口径局限与偏差来源
zoo-bench 报告
本 harness 的对照方案是开放的:实现 zoo_bench.adapters.BaseAdapter 的四个方法(setup / submit / drain / teardown),用 zoo_bench.adapters.registry.register 登记,或在 matrix.yaml 的 extra_modules 里列出你的模块路径——无需改动本仓库任何文件。你的实现会通过同一套等价性验证(提交 N 个执行体、断言全部执行且各执行一次),不通过的不会被采信。我们主动把这条路径写进报告:一份由被测框架维护者撰写、测量被测框架的报告,读者有理由怀疑对照被写慢或口径被挑选;让任何人能提交自己的对照,是这份报告可被质疑、也可被证伪的前提。
数据:加入你自己的对照
zoo-bench 报告
数据:自检
附录
幻灯片为了「一页一个结论」而压缩了篇幅;被压缩的只有排版,没有数值。
report.mdfigures/,另见 report.pdfresults/zoo-framework-dev/20261011T094251Z.json明细有一百多行,压进幻灯片等于让读者失去核对的手段。