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-0.6.0/20261011T091515Z.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.6.0 |
| 被测框架(模块 __version__) | 0.1.1-beta(仅附注,不作版本判据) |
| 被测框架的驱动面世代 | 上一代驱动面(workers 为可写属性,完成信号取自框架内部回调) |
| harness | zoo-bench 0.0.1 @ 9a42be24ac43f75e2e5d7b16434f91ba3d0717b6 |
| 复现命令 | zoo-bench run --framework zoo-framework==0.6.0 |
数据:运行环境
运行环境
以 dist_version(发行元数据)为版本真源;module_version 仅作附注
数据:运行环境
zoo-bench 报告
数据:负载
zoo-bench 报告
数据:测量口径
zoo-bench 报告
数据:结论摘要
结论摘要
数据:结论摘要
结论摘要
幻灯片为了「一页一个结论」只放了本章的前 2 页;余下 6 页的逐单元数值、分位数与原始样本都在全文的同一章节里,逐字可核。
全文:同目录 report.md 的「结论摘要」章节
结论摘要 · 框架自身开销占比
执行体 10000 微秒 时,zoo 的框架自身开销占比。
该档位有 5 个方案更低:apscheduler、asyncio_pool、bare_thread、process_pool、thread_pool。
同档对比:apscheduler 3.41%、asyncio_pool 1.51%、bare_thread 1.31%、process_pool 3.30%、thread_pool 0.64%
数据: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 | 606.25 微秒 | 293.74 微秒 | 145.49 微秒 | 143.75 微秒 | 336.43 微秒 | 74.84 微秒 |
| 1 | 300 | 867.95 微秒 | 559.04 微秒 | 389.99 微秒 | 399.35 微秒 | 606.27 微秒 | 338.26 微秒 |
| 1 | 2700 | 3.263 毫秒 | 2.989 毫秒 | 2.617 毫秒 | 2.690 毫秒 | 3.015 毫秒 | 2.669 毫秒 |
| 1 | 10000 | 10.505 毫秒 | 9.889 毫秒 | 9.708 毫秒 | 9.552 毫秒 | 9.702 毫秒 | 9.577 毫秒 |
| 4 | 40 | 611.17 微秒 | 267.20 微秒 | 153.05 微秒 | 158.85 微秒 | 192.86 微秒 | 95.11 微秒 |
| 4 | 300 | 866.98 微秒 | 526.01 微秒 | 428.07 微秒 | 415.41 微秒 | 283.82 微秒 | 361.48 微秒 |
| 4 | 2700 | 3.307 毫秒 | 3.003 毫秒 | 2.800 毫秒 | 2.693 毫秒 | 1.390 毫秒 | 2.676 毫秒 |
| 4 | 10000 | 10.700 毫秒 | 10.132 毫秒 | 9.695 毫秒 | 9.872 毫秒 | 4.608 毫秒 | 9.867 毫秒 |
| 16 | 40 | 610.25 微秒 | 226.27 微秒 | 138.37 微秒 | 171.89 微秒 | 161.53 微秒 | 92.31 微秒 |
| 16 | 300 | 878.71 微秒 | 484.41 微秒 | 395.42 微秒 | 423.77 微秒 | 278.33 微秒 | 353.51 微秒 |
| 16 | 2700 | 3.306 毫秒 | 2.977 毫秒 | 2.744 毫秒 | 2.704 毫秒 | 1.410 毫秒 | 2.790 毫秒 |
数据:维度:延迟分位数与抖动
维度:延迟分位数与抖动
| 并发度 | 执行体档位(微秒) | zoo | apscheduler | asyncio_pool | bare_thread | process_pool | thread_pool |
|---|---|---|---|---|---|---|---|
| 16 | 10000 | 10.596 毫秒 | 10.332 毫秒 | 9.964 毫秒 | 9.972 毫秒 | 4.636 毫秒 | 10.146 毫秒 |
| 64 | 40 | 565.92 微秒 | 223.95 微秒 | 120.73 微秒 | 170.05 微秒 | 196.54 微秒 | 89.40 微秒 |
| 64 | 300 | 842.59 微秒 | 507.24 微秒 | 371.91 微秒 | 425.03 微秒 | 300.97 微秒 | 355.32 微秒 |
| 64 | 2700 | 3.323 毫秒 | 2.949 毫秒 | 2.832 毫秒 | 2.764 毫秒 | 1.354 毫秒 | 2.788 毫秒 |
| 64 | 10000 | 10.636 毫秒 | 10.585 毫秒 | 10.189 毫秒 | 9.526 毫秒 | 4.629 毫秒 | 10.289 毫秒 |
逐单元数值(分位数、离散度、各轮原始样本)见文末「附录:全部数值」。
数据:维度:延迟分位数与抖动
维度:框架自身开销占比
并发度 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 | 88.13% | 80.50% | 66.60% | 64.52% | 83.87% | 40.99% |
| 1 | 300 | 62.15% | 46.08% | 25.72% | 26.40% | 49.32% | 12.38% |
| 1 | 2700 | 17.04% | 8.91% | 4.87% | 4.18% | 11.36% | 1.76% |
| 1 | 10000 | 5.28% | 3.41% | 1.51% | 1.31% | 3.30% | 0.64% |
| 4 | 40 | 89.54% | 79.29% | 64.75% | 67.82% | 51.69% | 48.45% |
| 4 | 300 | 62.78% | 39.72% | 24.92% | 29.04% | — | 14.55% |
| 4 | 2700 | 19.63% | 10.01% | 4.93% | 4.60% | — | 2.23% |
| 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 | 1649.5 | 3404.3 | 6873.2 | 6956.3 | 2972.4 | 13362.6 |
| 1 | 300 | 1152.1 | 1788.8 | 2564.2 | 2504.1 | 1649.4 | 2956.3 |
| 1 | 2700 | 306.5 | 334.5 | 382.1 | 371.7 | 331.7 | 374.6 |
| 1 | 10000 | 95.2 | 101.1 | 103.0 | 104.7 | 103.1 | 104.4 |
| 4 | 40 | 6544.9 | 14970.0 | 26136.1 | 25180.5 | 20740.7 | 42055.6 |
| 4 | 300 | 4613.7 | 7604.4 | 9344.3 | 9629.0 | 14093.4 | 11065.7 |
| 4 | 2700 | 1209.4 | 1331.9 | 1428.5 | 1485.5 | 2878.6 | 1494.9 |
| 4 | 10000 | 373.8 | 394.8 | 412.6 | 405.2 | 868.1 | 405.4 |
| 16 | 40 | 26218.8 | 70711.5 | 115629.2 | 93082.7 | 99052.0 | 173329.2 |
| 16 | 300 | 18208.4 | 33030.1 | 40462.9 | 37756.1 | 57486.6 | 45260.1 |
| 16 | 2700 | 4839.3 | 5375.2 | 5831.5 | 5917.6 | 11345.1 | 5735.0 |
数据:维度:吞吐与并发伸缩
维度:吞吐与并发伸缩
| 并发度 | 执行体档位(微秒) | zoo | apscheduler | asyncio_pool | bare_thread | process_pool | thread_pool |
|---|---|---|---|---|---|---|---|
| 16 | 10000 | 1510.0 | 1548.6 | 1605.9 | 1604.5 | 3451.0 | 1577.0 |
| 64 | 40 | 113090.9 | 285777.7 | 530094.2 | 376362.9 | 325635.1 | 715882.7 |
| 64 | 300 | 75956.6 | 126173.2 | 172085.1 | 150577.9 | 212645.4 | 180117.2 |
| 64 | 2700 | 19258.5 | 21702.3 | 22599.7 | 23154.0 | 47269.4 | 22956.6 |
| 64 | 10000 | 6017.5 | 6046.2 | 6281.4 | 6718.2 | 13826.1 | 6220.2 |
逐单元数值(分位数、离散度、各轮原始样本)见文末「附录:全部数值」。
数据:维度:吞吐与并发伸缩
zoo-bench 报告
口径:把每任务端到端拆成提交侧 / 手交 / 执行体 / 回程四段,并在同一档位与并发度下与各对照方案逐段对照,回答「超出对照的部分落在哪一段」。它是诊断而非主证据:抽样一小批档位,且不与对照方案比总开销。手交为负不是错误:那表示提交调用还没返回、执行体就已经开跑——把建线程一类工作算进提交侧的方案就会这样(实测 bare_thread 手交 -343 微秒)。回程含完成信号的等待(排空返回前的最后一段),它与主测量是同一口径
状态:ok
本维度是诊断不是主证据:抽样的档位与并发度固定为一小批,不覆盖矩阵里的全部单元。并发度上界取机器的并行能力——超过它时量到的是争用;
抽样档位(微秒):40、10000;并发度:[1, 4];该机器并行能力:4
| 方案 | 并发度 | 档位(微秒) | 提交侧 | 手交 | 执行体 | 回程 | 状态 |
|---|---|---|---|---|---|---|---|
| apscheduler | 1 | 40 | 107.44 微秒 | 91.43 微秒 | 50.14 微秒 | 39.97 微秒 | ok |
| apscheduler | 4 | 40 | 110.35 微秒 | 524.42 微秒 | 55.76 微秒 | 229.78 微秒 | ok |
| apscheduler | 1 | 10000 | 138.62 微秒 | 110.21 微秒 | 9.664 毫秒 | 49.29 微秒 | ok |
数据:维度:开销归因
维度:开销归因
| 方案 | 并发度 | 档位(微秒) | 提交侧 | 手交 | 执行体 | 回程 | 状态 |
|---|---|---|---|---|---|---|---|
| apscheduler | 4 | 10000 | 120.24 微秒 | 12.806 毫秒 | 14.493 毫秒 | 9.873 毫秒 | ok |
| asyncio_pool | 1 | 40 | 17.47 微秒 | 26.05 微秒 | 47.28 微秒 | 58.04 微秒 | ok |
| asyncio_pool | 4 | 40 | 18.91 微秒 | 250.49 微秒 | 53.92 微秒 | 283.87 微秒 | ok |
| asyncio_pool | 1 | 10000 | 23.03 微秒 | 35.74 微秒 | 9.574 毫秒 | 84.68 微秒 | ok |
| asyncio_pool | 4 | 10000 | 22.74 微秒 | 12.394 毫秒 | 10.117 毫秒 | 10.093 毫秒 | ok |
| bare_thread | 1 | 40 | 143.44 微秒 | -75.55 微秒 | 51.49 微秒 | 30.78 微秒 | ok |
| bare_thread | 4 | 40 | 152.07 微秒 | -74.15 微秒 | 50.96 微秒 | 304.52 微秒 | ok |
| bare_thread | 1 | 10000 | 5.171 毫秒 | -5093.61 微秒 | 9.397 毫秒 | 37.25 微秒 | ok |
| bare_thread | 4 | 10000 | 5.180 毫秒 | -5085.51 微秒 | 14.704 毫秒 | 9.875 毫秒 | 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 逐个开启),不与对照方案横向比较——裸写法没有优先级/超时/重试的对应物,故只能回答“本框架的语义值多少钱”,不能回答“比裸写法贵多少”
状态:not_measured(结论在该次测量装着的「previous」代驱动面上得出)
在当前被测版本上,枚举出的语义项没有一项可测:要么其执行动作未实现,要么所在层无法执行反应器。按 design D7 的逃生口,此类项被剔除而非用近似状态代替
| 语义项 | 层级 | 探查方式 | 可测 | 证据 / 原因 |
|---|---|---|---|---|
| 超时 | 派发层 | 行为探查(按调度轮反复驱动,量在飞表摘除时刻) | 否 | 判定存在但执行动作未实现:本探查按调度轮驱动、探查 worker 也声明了循环,调度轮确实跑过,故未摘除只能是判定本身没有执行动作——开启它只多算一次减法,量到的不是语义的代价 |
| 优先级 | 事件层 | 结构探查(检查执行所需的符号是否存在) | 否 | 事件层执行反应器要先有 perform:EventWorker._execute 调 reactor.perform(workers/event_worker.py),而 EventReactor 只定义了 execute(reactor/event_reactor.py)——反应器一旦匹配即抛 AttributeError;EventPriorityCalculator 存在(fifo/node/event_fifo_node.py)但未接入 drain 循环——workers/event_worker.py 里“根据优先级排序”只有一句注释 |
| 重试 | 事件层 | 结构探查(检查执行所需的符号是否存在) | 否 | 事件层执行反应器要先有 perform:EventWorker._execute 调 reactor.perform(workers/event_worker.py),而 EventReactor 只定义了 execute(reactor/event_reactor.py)——反应器一旦匹配即抛 AttributeError;retry_times 的默认 0 是干净的关闭态,但触发条件是“没有匹配到反应器”,而反应器路径本身不可执行 |
本结论按被测版本得出,坐标只对该版本成立;往 matrix.yaml 追加版本后须重跑本探查
数据:维度:调度语义的代价
zoo-bench 报告
口径:该线独立测量:它不进入主矩阵的透视表与交叉点,其数值也不可与那些表里的对照方案横向比较
该线结论: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 个)
数据:维度:原生任务线:同一被测对象的三种执行形态
zoo-bench 报告
被测框架处于优势的档位(两侧差异大于该档位的带宽)。它与「公开的不利数据」出自同一份同运行内的相对比,只是一个取更快的、一个取更慢的——两者的覆盖面相同,故谁都挑不了档位。本节的缺席不构成不合格:分不出胜负或处处更慢时它就应当是空的
所测档位内未出现被测框架处于优势的情形。
数据:被测框架在哪些档位更快
公开的不利数据 · 归类
最差 2.70x(并发 16 · 40 微秒)。全部档位:并发 1 · 40 微秒、并发 1 · 300 微秒、并发 1 · 2700 微秒、并发 1 · 10000 微秒、并发 4 · 40 微秒、并发 4 · 300 微秒、并发 4 · 10000 微秒、并发 16 · 40 微秒、并发 16 · 300 微秒、并发 16 · 2700 微秒、并发 64 · 40 微秒、并发 64 · 300 微秒、并发 64 · 2700 微秒
最差 4.69x(并发 64 · 40 微秒)。全部档位:并发 1 · 40 微秒、并发 1 · 300 微秒、并发 1 · 2700 微秒、并发 1 · 10000 微秒、并发 4 · 40 微秒、并发 4 · 300 微秒、并发 4 · 2700 微秒、并发 4 · 10000 微秒、并发 16 · 40 微秒、并发 16 · 300 微秒、并发 16 · 2700 微秒、并发 16 · 10000 微秒、并发 64 · 40 微秒、并发 64 · 300 微秒、并发 64 · 2700 微秒、并发 64 · 10000 微秒
最差 4.22x(并发 1 · 40 微秒)。全部档位:并发 1 · 40 微秒、并发 1 · 300 微秒、并发 1 · 2700 微秒、并发 1 · 10000 微秒、并发 4 · 40 微秒、并发 4 · 300 微秒、并发 4 · 2700 微秒、并发 4 · 10000 微秒、并发 16 · 40 微秒、并发 16 · 300 微秒、并发 16 · 2700 微秒、并发 16 · 10000 微秒、并发 64 · 40 微秒、并发 64 · 300 微秒、并发 64 · 2700 微秒、并发 64 · 10000 微秒
最差 3.78x(并发 16 · 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 微秒、并发 64 · 10000 微秒
最差 8.10x(并发 1 · 40 微秒)。全部档位:并发 1 · 40 微秒、并发 1 · 300 微秒、并发 1 · 2700 微秒、并发 1 · 10000 微秒、并发 4 · 40 微秒、并发 4 · 300 微秒、并发 4 · 2700 微秒、并发 16 · 40 微秒、并发 16 · 300 微秒、并发 16 · 2700 微秒、并发 16 · 10000 微秒、并发 64 · 40 微秒、并发 64 · 300 微秒、并发 64 · 2700 微秒、并发 64 · 10000 微秒
数据:zoo-bench「公开的不利数据」· 逐档明细见其后的页与 report.md
zoo-bench 报告
被测框架处于劣势的档位(两侧差异大于该档位的带宽)。这部分缺失的报告不合格——一份只展示自己赢的报告,读者有理由认为它不可信。差异小于带宽的档位不在本节,而在「分不出胜负」那一节:那是判据的结果,不是把它们藏起来
| 对照方案 | 并发度 | 执行体档位(微秒) | 差距 | 被测框架中位数 |
|---|---|---|---|---|
| apscheduler | 1 | 40 | apscheduler 比 zoo 快 2.06x | 606.25 微秒 |
| asyncio_pool | 1 | 40 | asyncio_pool 比 zoo 快 4.17x | 606.25 微秒 |
| bare_thread | 1 | 40 | bare_thread 比 zoo 快 4.22x | 606.25 微秒 |
| process_pool | 1 | 40 | process_pool 比 zoo 快 1.80x | 606.25 微秒 |
| thread_pool | 1 | 40 | thread_pool 比 zoo 快 8.10x | 606.25 微秒 |
| apscheduler | 1 | 300 | apscheduler 比 zoo 快 1.55x | 867.95 微秒 |
| asyncio_pool | 1 | 300 | asyncio_pool 比 zoo 快 2.23x | 867.95 微秒 |
| bare_thread | 1 | 300 | bare_thread 比 zoo 快 2.17x | 867.95 微秒 |
| process_pool | 1 | 300 | process_pool 比 zoo 快 1.43x | 867.95 微秒 |
| thread_pool | 1 | 300 | thread_pool 比 zoo 快 2.57x | 867.95 微秒 |
| apscheduler | 1 | 2700 | apscheduler 比 zoo 快 1.09x | 3.263 毫秒 |
数据:公开的不利数据
公开的不利数据
| 对照方案 | 并发度 | 执行体档位(微秒) | 差距 | 被测框架中位数 |
|---|---|---|---|---|
| asyncio_pool | 1 | 2700 | asyncio_pool 比 zoo 快 1.25x | 3.263 毫秒 |
| bare_thread | 1 | 2700 | bare_thread 比 zoo 快 1.21x | 3.263 毫秒 |
| thread_pool | 1 | 2700 | thread_pool 比 zoo 快 1.22x | 3.263 毫秒 |
| apscheduler | 1 | 10000 | apscheduler 比 zoo 快 1.06x | 10.505 毫秒 |
| asyncio_pool | 1 | 10000 | asyncio_pool 比 zoo 快 1.08x | 10.505 毫秒 |
| bare_thread | 1 | 10000 | bare_thread 比 zoo 快 1.10x | 10.505 毫秒 |
| process_pool | 1 | 10000 | process_pool 比 zoo 快 1.08x | 10.505 毫秒 |
| thread_pool | 1 | 10000 | thread_pool 比 zoo 快 1.10x | 10.505 毫秒 |
| apscheduler | 4 | 40 | apscheduler 比 zoo 快 2.29x | 611.17 微秒 |
| asyncio_pool | 4 | 40 | asyncio_pool 比 zoo 快 3.99x | 611.17 微秒 |
| bare_thread | 4 | 40 | bare_thread 比 zoo 快 3.85x | 611.17 微秒 |
| process_pool | 4 | 40 | process_pool 比 zoo 快 3.17x | 611.17 微秒 |
| thread_pool | 4 | 40 | thread_pool 比 zoo 快 6.43x | 611.17 微秒 |
数据:公开的不利数据
公开的不利数据
| 对照方案 | 并发度 | 执行体档位(微秒) | 差距 | 被测框架中位数 |
|---|---|---|---|---|
| apscheduler | 4 | 300 | apscheduler 比 zoo 快 1.65x | 866.98 微秒 |
| asyncio_pool | 4 | 300 | asyncio_pool 比 zoo 快 2.03x | 866.98 微秒 |
| bare_thread | 4 | 300 | bare_thread 比 zoo 快 2.09x | 866.98 微秒 |
| process_pool | 4 | 300 | process_pool 比 zoo 快 3.05x | 866.98 微秒 |
| thread_pool | 4 | 300 | thread_pool 比 zoo 快 2.40x | 866.98 微秒 |
| asyncio_pool | 4 | 2700 | asyncio_pool 比 zoo 快 1.18x | 3.307 毫秒 |
| bare_thread | 4 | 2700 | bare_thread 比 zoo 快 1.23x | 3.307 毫秒 |
| process_pool | 4 | 2700 | process_pool 比 zoo 快 2.38x | 3.307 毫秒 |
| thread_pool | 4 | 2700 | thread_pool 比 zoo 快 1.24x | 3.307 毫秒 |
| apscheduler | 4 | 10000 | apscheduler 比 zoo 快 1.06x | 10.700 毫秒 |
| asyncio_pool | 4 | 10000 | asyncio_pool 比 zoo 快 1.10x | 10.700 毫秒 |
| bare_thread | 4 | 10000 | bare_thread 比 zoo 快 1.08x | 10.700 毫秒 |
| process_pool | 4 | 10000 | process_pool 比 zoo 快 2.32x | 10.700 毫秒 |
数据:公开的不利数据
公开的不利数据
| 对照方案 | 并发度 | 执行体档位(微秒) | 差距 | 被测框架中位数 |
|---|---|---|---|---|
| apscheduler | 16 | 40 | apscheduler 比 zoo 快 2.70x | 610.25 微秒 |
| asyncio_pool | 16 | 40 | asyncio_pool 比 zoo 快 4.41x | 610.25 微秒 |
| bare_thread | 16 | 40 | bare_thread 比 zoo 快 3.55x | 610.25 微秒 |
| process_pool | 16 | 40 | process_pool 比 zoo 快 3.78x | 610.25 微秒 |
| thread_pool | 16 | 40 | thread_pool 比 zoo 快 6.61x | 610.25 微秒 |
| apscheduler | 16 | 300 | apscheduler 比 zoo 快 1.81x | 878.71 微秒 |
| asyncio_pool | 16 | 300 | asyncio_pool 比 zoo 快 2.22x | 878.71 微秒 |
| bare_thread | 16 | 300 | bare_thread 比 zoo 快 2.07x | 878.71 微秒 |
| process_pool | 16 | 300 | process_pool 比 zoo 快 3.16x | 878.71 微秒 |
| thread_pool | 16 | 300 | thread_pool 比 zoo 快 2.49x | 878.71 微秒 |
| apscheduler | 16 | 2700 | apscheduler 比 zoo 快 1.11x | 3.306 毫秒 |
| asyncio_pool | 16 | 2700 | asyncio_pool 比 zoo 快 1.21x | 3.306 毫秒 |
| bare_thread | 16 | 2700 | bare_thread 比 zoo 快 1.22x | 3.306 毫秒 |
数据:公开的不利数据
公开的不利数据
| 对照方案 | 并发度 | 执行体档位(微秒) | 差距 | 被测框架中位数 |
|---|---|---|---|---|
| process_pool | 16 | 2700 | process_pool 比 zoo 快 2.34x | 3.306 毫秒 |
| thread_pool | 16 | 2700 | thread_pool 比 zoo 快 1.19x | 3.306 毫秒 |
| asyncio_pool | 16 | 10000 | asyncio_pool 比 zoo 快 1.06x | 10.596 毫秒 |
| bare_thread | 16 | 10000 | bare_thread 比 zoo 快 1.06x | 10.596 毫秒 |
| process_pool | 16 | 10000 | process_pool 比 zoo 快 2.29x | 10.596 毫秒 |
| thread_pool | 16 | 10000 | thread_pool 比 zoo 快 1.04x | 10.596 毫秒 |
| apscheduler | 64 | 40 | apscheduler 比 zoo 快 2.53x | 565.92 微秒 |
| asyncio_pool | 64 | 40 | asyncio_pool 比 zoo 快 4.69x | 565.92 微秒 |
| bare_thread | 64 | 40 | bare_thread 比 zoo 快 3.33x | 565.92 微秒 |
| process_pool | 64 | 40 | process_pool 比 zoo 快 2.88x | 565.92 微秒 |
| thread_pool | 64 | 40 | thread_pool 比 zoo 快 6.33x | 565.92 微秒 |
| apscheduler | 64 | 300 | apscheduler 比 zoo 快 1.66x | 842.59 微秒 |
| asyncio_pool | 64 | 300 | asyncio_pool 比 zoo 快 2.27x | 842.59 微秒 |
数据:公开的不利数据
公开的不利数据
| 对照方案 | 并发度 | 执行体档位(微秒) | 差距 | 被测框架中位数 |
|---|---|---|---|---|
| bare_thread | 64 | 300 | bare_thread 比 zoo 快 1.98x | 842.59 微秒 |
| process_pool | 64 | 300 | process_pool 比 zoo 快 2.80x | 842.59 微秒 |
| thread_pool | 64 | 300 | thread_pool 比 zoo 快 2.37x | 842.59 微秒 |
| apscheduler | 64 | 2700 | apscheduler 比 zoo 快 1.13x | 3.323 毫秒 |
| asyncio_pool | 64 | 2700 | asyncio_pool 比 zoo 快 1.17x | 3.323 毫秒 |
| bare_thread | 64 | 2700 | bare_thread 比 zoo 快 1.20x | 3.323 毫秒 |
| process_pool | 64 | 2700 | process_pool 比 zoo 快 2.45x | 3.323 毫秒 |
| thread_pool | 64 | 2700 | thread_pool 比 zoo 快 1.19x | 3.323 毫秒 |
| asyncio_pool | 64 | 10000 | asyncio_pool 比 zoo 快 1.04x | 10.636 毫秒 |
| bare_thread | 64 | 10000 | bare_thread 比 zoo 快 1.12x | 10.636 毫秒 |
| process_pool | 64 | 10000 | process_pool 比 zoo 快 2.30x | 10.636 毫秒 |
| thread_pool | 64 | 10000 | thread_pool 比 zoo 快 1.03x | 10.636 毫秒 |
数据:公开的不利数据
zoo-bench 报告
两侧分不出胜负的档位:差异小于该档位的带宽。带宽取自同一次运行内两侧各自的跨轮离散度(每任务中位数的标准差 / 中位数)之和,故它随样本变化,读者可用留档里的逐轮样本自行复核。它同样覆盖全部所测档位、逐项写明原因——本节不是藏东西的地方:把噪声级差异报成「快 1.00x」才是
判据:带宽 = 被测框架侧与对照侧各自的跨轮相对离散度之和;单侧的跨轮相对离散度 = 该单元逐轮的「每任务中位数」的标准差 / 中位数
本期带宽:1.6% 到 41.9%(随各档位的离散度不同而不同)。
| 对照方案 | 并发度 | 执行体档位(微秒) | 比值 | 原因 |
|---|---|---|---|---|
| process_pool | 1 | 2700 | 0.92x | 两侧差异 7.6% 小于带宽 21.2%,分不出胜负 |
| apscheduler | 4 | 2700 | 0.91x | 两侧差异 9.2% 小于带宽 9.6%,分不出胜负 |
| thread_pool | 4 | 10000 | 0.92x | 两侧差异 7.8% 小于带宽 9.2%,分不出胜负 |
| apscheduler | 16 | 10000 | 0.98x | 两侧差异 2.5% 小于带宽 5.1%,分不出胜负 |
| apscheduler | 64 | 10000 | 1.00x | 两侧差异 0.5% 小于带宽 4.1%,分不出胜负 |
数据:分不出胜负的档位
zoo-bench 报告
数据:口径局限与偏差来源
口径局限与偏差来源
数据:口径局限与偏差来源
口径局限与偏差来源
幻灯片为了「一页一个结论」只放了本章的前 2 页;余下 1 页的逐单元数值、分位数与原始样本都在全文的同一章节里,逐字可核。
全文:同目录 report.md 的「口径局限与偏差来源」章节
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-0.6.0/20261011T091515Z.json明细有一百多行,压进幻灯片等于让读者失去核对的手段。