zoo-bench - 2026-10-11 - AMD EPYC 7763 64-Core Processor
Same-caliber comparison against 5 baselines: apscheduler, asyncio_pool, bare_thread, process_pool, thread_pool. Every number was re-measured on this machine by zoo-bench and published per tier, including the tiers the framework under test loses.
raw data: results/zoo-framework-dev/20261011T094251Z.json
zoo-bench report
| item | value |
|---|---|
| CPU model | AMD EPYC 7763 64-Core Processor |
| logical cores | 4 |
| platform | Linux-x86_64 |
| operating system | Linux 6.17.0-1022-azure (#22-Ubuntu SMP Mon Jul 27 17:24:03 UTC 2026) |
| Python | CPython 3.13.16 |
| interpreter | /opt/hostedtoolcache/Python/3.13.16/x64/bin/python |
| GIL | default |
| framework under test (distribution metadata) | 0.11.2-beta |
| framework under test (module __version__) | 0.11.2-beta (footnote only, not the version criterion) |
| drive-surface generation of the framework under test | current-generation drive surface (scheduling core + scheduling model; the completion signal comes from the result reactor) |
| install source | dev via git |
| commit | 44dcbca5f392 |
| harness | zoo-bench 0.0.1 @ 9a42be24ac43f75e2e5d7b16434f91ba3d0717b6 |
data: Run environment
Run environment
| item | value |
|---|---|
| command to reproduce | zoo-bench run --framework zoo-framework @ git+https://github.com/YearsAlso/zoo-framework.git@dev |
dist_version (the distribution metadata) is the source of truth; module_version is only a footnote
data: Run environment
zoo-bench report
data: Workload
zoo-bench report
data: Measurement methodology
zoo-bench report
data: Conclusion summary
Conclusion summary
data: Conclusion summary
Conclusion summary
For one conclusion per slide, only the first 2 slides of this section are shown; the remaining 9 slides of per-unit numbers, percentiles and raw samples sit in the same section of the full report, verbatim checkable.
full report: the "Conclusion summary" section of report.md in the same directory
Conclusion summary - framework overhead share
Framework overhead share of zoo at body tier 10000 microseconds.
2 baselines are lower at this tier: bare_thread, thread_pool.
same-tier comparison: apscheduler 3.50%, asyncio_pool 1.71%, bare_thread 1.36%, process_pool 3.65%, thread_pool 0.60%
data: zoo-bench "framework overhead share" at concurrency 1, body tier 10000 microseconds
Dimension: Latency percentiles and jitter
concurrency 1 - end-to-end / concurrency
data: zoo-bench "Latency percentiles and jitter" at concurrency 1 - per-unit numbers and percentiles are in the same section of report.md
Dimension: Latency percentiles and jitter
concurrency 1 - end-to-end / concurrency
data: zoo-bench "Latency percentiles and jitter" at concurrency 1 - per-unit numbers and percentiles are in the same section of report.md
zoo-bench report
end-to-end / concurrency; percentiles and relative spread are given in the same table - a metric that only gives the median is not acceptable
| concurrency | body tier (microseconds) | zoo | apscheduler | asyncio_pool | bare_thread | process_pool | thread_pool |
|---|---|---|---|---|---|---|---|
| 1 | 40 | 151.05 microseconds | 287.86 microseconds | 142.30 microseconds | 145.22 microseconds | 349.41 microseconds | 75.73 microseconds |
| 1 | 300 | 410.28 microseconds | 553.65 microseconds | 385.12 microseconds | 388.13 microseconds | 590.88 microseconds | 313.96 microseconds |
| 1 | 2700 | 2.753 milliseconds | 2.987 milliseconds | 2.699 milliseconds | 2.634 milliseconds | 2.988 milliseconds | 2.667 milliseconds |
| 1 | 10000 | 9.871 milliseconds | 9.941 milliseconds | 9.474 milliseconds | 9.553 milliseconds | 9.773 milliseconds | 9.525 milliseconds |
| 4 | 40 | 174.59 microseconds | 252.70 microseconds | 162.47 microseconds | 158.14 microseconds | 167.32 microseconds | 97.54 microseconds |
| 4 | 300 | 449.42 microseconds | 521.58 microseconds | 422.43 microseconds | 412.54 microseconds | 306.62 microseconds | 346.42 microseconds |
| 4 | 2700 | 2.911 milliseconds | 2.912 milliseconds | 2.754 milliseconds | 2.683 milliseconds | 1.390 milliseconds | 2.689 milliseconds |
| 4 | 10000 | 9.949 milliseconds | 9.993 milliseconds | 9.670 milliseconds | 9.713 milliseconds | 4.653 milliseconds | 9.529 milliseconds |
| 16 | 40 | 177.55 microseconds | 229.36 microseconds | 133.81 microseconds | 171.28 microseconds | 156.46 microseconds | 90.20 microseconds |
| 16 | 300 | 466.12 microseconds | 505.80 microseconds | 396.45 microseconds | 423.99 microseconds | 275.04 microseconds | 345.34 microseconds |
data: Dimension: Latency percentiles and jitter
Dimension: Latency percentiles and jitter
| concurrency | body tier (microseconds) | zoo | apscheduler | asyncio_pool | bare_thread | process_pool | thread_pool |
|---|---|---|---|---|---|---|---|
| 16 | 2700 | 2.908 milliseconds | 2.947 milliseconds | 2.770 milliseconds | 2.705 milliseconds | 1.381 milliseconds | 2.740 milliseconds |
| 16 | 10000 | 10.146 milliseconds | 10.216 milliseconds | 9.917 milliseconds | 9.716 milliseconds | 4.712 milliseconds | 9.785 milliseconds |
| 64 | 40 | 205.09 microseconds | 221.11 microseconds | 121.88 microseconds | 170.85 microseconds | 204.14 microseconds | 91.39 microseconds |
| 64 | 300 | 462.64 microseconds | 509.59 microseconds | 381.72 microseconds | 425.01 microseconds | 307.25 microseconds | 352.74 microseconds |
| 64 | 2700 | 2.884 milliseconds | 2.905 milliseconds | 2.779 milliseconds | 2.746 milliseconds | 1.379 milliseconds | 2.647 milliseconds |
| 64 | 10000 | 10.447 milliseconds | 10.197 milliseconds | 9.811 milliseconds | 9.532 milliseconds | 4.713 milliseconds | 10.238 milliseconds |
per-unit values (percentiles, spread, raw per-round samples) are in 'Appendix: all values' at the end.
data: Dimension: Latency percentiles and jitter
Dimension: Framework overhead share
concurrency 1 - framework overhead
data: zoo-bench "Framework overhead share" at concurrency 1 - per-unit numbers and percentiles are in the same section of report.md
Dimension: Framework overhead share
concurrency 1 - framework overhead
data: zoo-bench "Framework overhead share" at concurrency 1 - per-unit numbers and percentiles are in the same section of report.md
zoo-bench report
overhead = end-to-end / concurrency - the body duration measured within the same run (no cross-run subtraction). cells with -: that concurrency exceeds this machine's parallel capacity; the body's self-reported duration contains scheduling waits from oversubscription and is not comparable with the row's end-to-end per task, so no overhead figure is given (end-to-end and throughput live in their own dimensions)
| concurrency | body tier (microseconds) | 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% |
data: Dimension: Framework overhead share
Dimension: Framework overhead share
| concurrency | body tier (microseconds) | zoo | apscheduler | asyncio_pool | bare_thread | process_pool | thread_pool |
|---|---|---|---|---|---|---|---|
| 4 | 2700 | 6.07% | 9.25% | 5.48% | 4.89% | - | 3.51% |
| 4 | 10000 | - | - | - | - | - | - |
| 16 | 40 | - | - | - | - | - | - |
| 16 | 300 | - | - | - | - | - | - |
| 16 | 2700 | - | - | - | - | - | - |
| 16 | 10000 | - | - | - | - | - | - |
| 64 | 40 | - | - | - | - | - | - |
| 64 | 300 | - | - | - | - | - | - |
| 64 | 2700 | - | - | - | - | - | - |
| 64 | 10000 | - | - | - | - | - | - |
per-unit values (percentiles, spread, raw per-round samples) are in 'Appendix: all values' at the end.
data: Dimension: Framework overhead share
Dimension: Throughput and concurrency scaling
concurrency 1 - throughput
data: zoo-bench "Throughput and concurrency scaling" at concurrency 1 - per-unit numbers and percentiles are in the same section of report.md
Dimension: Throughput and concurrency scaling
concurrency 1 - throughput
data: zoo-bench "Throughput and concurrency scaling" at concurrency 1 - per-unit numbers and percentiles are in the same section of report.md
zoo-bench report
throughput = concurrency / median end-to-end; whether it keeps rising with concurrency is the scaling behaviour
| concurrency | body tier (microseconds) | 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 |
data: Dimension: Throughput and concurrency scaling
Dimension: Throughput and concurrency scaling
| concurrency | body tier (microseconds) | 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 |
per-unit values (percentiles, spread, raw per-round samples) are in 'Appendix: all values' at the end.
data: Dimension: Throughput and concurrency scaling
zoo-bench report
scope: splits the per-task end-to-end into submit side / handoff / body / return and, at the same tier and concurrency, compares each segment against every baseline, answering 'which segment the excess falls on'. It is diagnostic, not the main evidence: it samples a small set of tiers, and does not compare total overhead against the baselines. A negative handoff is not an error: it means the submit call had not returned yet while the body was already running - schemes that count thread creation as submit side behave this way (measured: bare_thread handoff -343 microseconds). **The return segment includes waiting for th
e completion signal** (the last stretch before draining returns);
it shares the main measurement's scope
data: Dimension: Overhead attribution
Dimension: Overhead attribution
status: ok
this dimension is a diagnosis, not the main evidence: the sampled tiers and concurrencies are a fixed small batch, not the whole matrix. The concurrency ceiling is the machine's parallel capacity - beyond it, what is measured is contention;
sampled tiers (microseconds): 40, 10000; concurrency: [1, 4]; this machine's parallel capacity: 4
data: Dimension: Overhead attribution
Dimension: Overhead attribution
For one conclusion per slide, only the first 2 slides of this section are shown; the remaining 18 slides of per-unit numbers, percentiles and raw samples sit in the same section of the full report, verbatim checkable.
full report: the "Dimension: Overhead attribution" section of report.md in the same directory
zoo-bench report
scope: this dimension uses an internal switch comparison (same workload, semantics all off vs. enabled one by one) and does not compare across schemes - a bare writeup has no counterpart for priority / timeout / retry, so it can only answer 'what is this framework's semantics worth', not 'how much more expensive than a bare writeup'
status: ok (the conclusion was reached on the 'current' drive-surface generation installed during this measurement)
| semantics item | layer | how probed | measurable | evidence / reason |
|---|---|---|---|---|
| timeout | dispatch layer | behavioral probe (driven repeatedly through scheduling rounds; measures the moment the worker leaves the in-flight table) | yes | timeout reap observed: the worker left the in-flight table before the body ended (0.0122s) (body 0.15s, run_timeout 0.01s); judgment action at dispatch_core.py:472; what is in effect is observation and circuit-breaking (recording, marking unhealthy, removing the in-flight registration, stopping dispatch), not termination of the still-running worker - CPython cannot safely interrupt a running thread |
| priority | event layer | structural probe (checks whether the symbols required for execution exist) | no | not re-checked: this item's conclusion was reached on the 'previous' generation; taking it as this generation's fact asserts wiring in the report that the current generation does not have. Re-deriving it needs a probe design of its own (each item needs clean on/off states before it can be priced) |
| retry | event layer | structural probe (checks whether the symbols required for execution exist) | no | not re-checked: this item's conclusion was reached on the 'previous' generation; taking it as this generation's fact asserts wiring in the report that the current generation does not have. Re-deriving it needs a probe design of its own (each item needs clean on/off states before it can be priced) |
data: Dimension: The cost of scheduling semantics
Dimension: The cost of scheduling semantics
this conclusion was reached on the version under test and its coordinates hold for that version only; after appending a version to matrix.yaml, re-run this probe
data: Dimension: The cost of scheduling semantics
zoo-bench report
scope: this line is measured on its own: it enters neither the main matrix's pivot tables nor its crossings, and its numbers must not be read against the baseline adapters listed there
verdict: ok
equivalence gate: passed, 15 inputs compared byte for byte against the Python reference (envelope 256 bytes)
loaded task modbus_rtu.parse_response - Modbus RTU response-frame parsing: the input is a bare RTU ADU response frame (no transport framing), and the tier's frame bytes are its length
tiers R1, R8, R125 (frame bytes 7, 21, 255); concurrencies 1, 4, 16, 64; each cell runs 100 warm-up plus 100 measured rounds, one child process per concurrency (4 in all)
data: Dimension: Native task line: three execution forms of the same subject
Dimension: Native task line: three execution forms of the same subject
crossover (read at the judged concurrency 1 only): the native form is faster on R8, R125; slower on R1; undecided on none. crossover point: up to 7 frame bytes the native form is not faster, at or above 21 bytes it is
each figure is end-to-end per task (median of the measured rounds) - the same caliber as the main matrix's latency dimension
data: Dimension: Native task line: three execution forms of the same subject
Dimension: Native task line: three execution forms of the same subject
For one conclusion per slide, only the first 2 slides of this section are shown; the remaining 6 slides of per-unit numbers, percentiles and raw samples sit in the same section of the full report, verbatim checkable.
full report: the "Dimension: Native task line: three execution forms of the same subject" section of report.md in the same directory
zoo-bench report
Tiers where the framework under test is ahead (the two sides differ by more than that tier's band). This comes from the same within-run comparison as the openly published unfavourable data - one side takes the faster tiers, the other the slower ones, so both cover the same ground and neither can pick its own tiers. This section being empty is not a failure: it should be empty when nothing is distinguishable or when the framework loses everywhere.
| baseline | concurrency | body tier (microseconds) | gap | median of the framework under test |
|---|---|---|---|---|
| apscheduler | 1 | 40 | the framework under test is 1.91x faster than apscheduler | 151.05 microseconds |
| process_pool | 1 | 40 | the framework under test is 2.31x faster than process_pool | 151.05 microseconds |
| apscheduler | 1 | 300 | the framework under test is 1.35x faster than apscheduler | 410.28 microseconds |
| process_pool | 1 | 300 | the framework under test is 1.44x faster than process_pool | 410.28 microseconds |
| apscheduler | 1 | 2700 | the framework under test is 1.08x faster than apscheduler | 2.753 milliseconds |
data: tiers where the framework under test is faster
tiers where the framework under test is faster
| baseline | concurrency | body tier (microseconds) | gap | median of the framework under test |
|---|---|---|---|---|
| process_pool | 1 | 2700 | the framework under test is 1.09x faster than process_pool | 2.753 milliseconds |
| apscheduler | 4 | 40 | the framework under test is 1.45x faster than apscheduler | 174.59 microseconds |
| apscheduler | 4 | 300 | the framework under test is 1.16x faster than apscheduler | 449.42 microseconds |
| apscheduler | 16 | 40 | the framework under test is 1.29x faster than apscheduler | 177.55 microseconds |
| apscheduler | 16 | 300 | the framework under test is 1.09x faster than apscheduler | 466.12 microseconds |
| apscheduler | 64 | 300 | the framework under test is 1.10x faster than apscheduler | 462.64 microseconds |
data: tiers where the framework under test is faster
Openly published unfavourable data - summary
worst 1.68x (concurrency 64 at 40 microseconds). All tiers: concurrency 1 at 10000 microseconds, concurrency 4 at 2700 microseconds, concurrency 4 at 10000 microseconds, concurrency 16 at 40 microseconds, concurrency 16 at 300 microseconds, concurrency 16 at 2700 microseconds, concurrency 64 at 40 microseconds, concurrency 64 at 300 microseconds, concurrency 64 at 2700 microseconds, concurrency 64 at 10000 microseconds
worst 1.20x (concurrency 64 at 40 microseconds). All tiers: concurrency 1 at 2700 microseconds, concurrency 1 at 10000 microseconds, concurrency 4 at 300 microseconds, concurrency 4 at 2700 microseconds, concurrency 4 at 10000 microseconds, concurrency 16 at 300 microseconds, concurrency 16 at 2700 microseconds, concurrency 16 at 10000 microseconds, concurrency 64 at 40 microseconds, concurrency 64 at 300 microseconds, concurrency 64 at 2700 microseconds, concurrency 64 at 10000 microseconds
worst 2.22x (concurrency 64 at 10000 microseconds). All tiers: concurrency 4 at 300 microseconds, concurrency 4 at 2700 microseconds, concurrency 4 at 10000 microseconds, concurrency 16 at 300 microseconds, concurrency 16 at 2700 microseconds, concurrency 16 at 10000 microseconds, concurrency 64 at 300 microseconds, concurrency 64 at 2700 microseconds, concurrency 64 at 10000 microseconds
worst 2.24x (concurrency 64 at 40 microseconds). All tiers: concurrency 1 at 40 microseconds, concurrency 1 at 300 microseconds, concurrency 1 at 10000 microseconds, concurrency 4 at 40 microseconds, concurrency 4 at 300 microseconds, concurrency 4 at 2700 microseconds, concurrency 4 at 10000 microseconds, concurrency 16 at 40 microseconds, concurrency 16 at 300 microseconds, concurrency 16 at 2700 microseconds, concurrency 16 at 10000 microseconds, concurrency 64 at 40 microseconds, concurrency 64 at 300 microseconds, concurrency 64 at 2700 microseconds
data: zoo-bench "published unfavorable data" - per-tier details follow on later slides and in report.md
zoo-bench report
Tiers where the framework under test is behind (the two sides differ by more than that tier's band). A report missing this part is not acceptable - a report that only shows where it wins gives the reader every reason to distrust it. Tiers whose difference is smaller than the band are not here but in the 'no winner' section: that is the verdict's outcome, not a place to hide things.
| baseline | concurrency | body tier (microseconds) | gap | median of the framework under test |
|---|---|---|---|---|
| thread_pool | 1 | 40 | thread_pool is 1.99x faster than zoo | 151.05 microseconds |
| thread_pool | 1 | 300 | thread_pool is 1.31x faster than zoo | 410.28 microseconds |
| bare_thread | 1 | 2700 | bare_thread is 1.05x faster than zoo | 2.753 milliseconds |
| asyncio_pool | 1 | 10000 | asyncio_pool is 1.04x faster than zoo | 9.871 milliseconds |
| bare_thread | 1 | 10000 | bare_thread is 1.03x faster than zoo | 9.871 milliseconds |
| thread_pool | 1 | 10000 | thread_pool is 1.04x faster than zoo | 9.871 milliseconds |
data: Openly published unfavourable data
Openly published unfavourable data
| baseline | concurrency | body tier (microseconds) | gap | median of the framework under test |
|---|---|---|---|---|
| thread_pool | 4 | 40 | thread_pool is 1.79x faster than zoo | 174.59 microseconds |
| bare_thread | 4 | 300 | bare_thread is 1.09x faster than zoo | 449.42 microseconds |
| process_pool | 4 | 300 | process_pool is 1.47x faster than zoo | 449.42 microseconds |
| thread_pool | 4 | 300 | thread_pool is 1.30x faster than zoo | 449.42 microseconds |
| asyncio_pool | 4 | 2700 | asyncio_pool is 1.06x faster than zoo | 2.911 milliseconds |
| bare_thread | 4 | 2700 | bare_thread is 1.09x faster than zoo | 2.911 milliseconds |
| process_pool | 4 | 2700 | process_pool is 2.09x faster than zoo | 2.911 milliseconds |
| thread_pool | 4 | 2700 | thread_pool is 1.08x faster than zoo | 2.911 milliseconds |
| asyncio_pool | 4 | 10000 | asyncio_pool is 1.03x faster than zoo | 9.949 milliseconds |
| bare_thread | 4 | 10000 | bare_thread is 1.02x faster than zoo | 9.949 milliseconds |
| process_pool | 4 | 10000 | process_pool is 2.14x faster than zoo | 9.949 milliseconds |
| thread_pool | 4 | 10000 | thread_pool is 1.04x faster than zoo | 9.949 milliseconds |
| asyncio_pool | 16 | 40 | asyncio_pool is 1.33x faster than zoo | 177.55 microseconds |
data: Openly published unfavourable data
Openly published unfavourable data
| baseline | concurrency | body tier (microseconds) | gap | median of the framework under test |
|---|---|---|---|---|
| thread_pool | 16 | 40 | thread_pool is 1.97x faster than zoo | 177.55 microseconds |
| asyncio_pool | 16 | 300 | asyncio_pool is 1.18x faster than zoo | 466.12 microseconds |
| bare_thread | 16 | 300 | bare_thread is 1.10x faster than zoo | 466.12 microseconds |
| process_pool | 16 | 300 | process_pool is 1.69x faster than zoo | 466.12 microseconds |
| thread_pool | 16 | 300 | thread_pool is 1.35x faster than zoo | 466.12 microseconds |
| asyncio_pool | 16 | 2700 | asyncio_pool is 1.05x faster than zoo | 2.908 milliseconds |
| bare_thread | 16 | 2700 | bare_thread is 1.08x faster than zoo | 2.908 milliseconds |
| process_pool | 16 | 2700 | process_pool is 2.11x faster than zoo | 2.908 milliseconds |
| thread_pool | 16 | 2700 | thread_pool is 1.06x faster than zoo | 2.908 milliseconds |
| bare_thread | 16 | 10000 | bare_thread is 1.04x faster than zoo | 10.146 milliseconds |
| process_pool | 16 | 10000 | process_pool is 2.15x faster than zoo | 10.146 milliseconds |
| thread_pool | 16 | 10000 | thread_pool is 1.04x faster than zoo | 10.146 milliseconds |
| asyncio_pool | 64 | 40 | asyncio_pool is 1.68x faster than zoo | 205.09 microseconds |
data: Openly published unfavourable data
Openly published unfavourable data
| baseline | concurrency | body tier (microseconds) | gap | median of the framework under test |
|---|---|---|---|---|
| bare_thread | 64 | 40 | bare_thread is 1.20x faster than zoo | 205.09 microseconds |
| thread_pool | 64 | 40 | thread_pool is 2.24x faster than zoo | 205.09 microseconds |
| asyncio_pool | 64 | 300 | asyncio_pool is 1.21x faster than zoo | 462.64 microseconds |
| bare_thread | 64 | 300 | bare_thread is 1.09x faster than zoo | 462.64 microseconds |
| process_pool | 64 | 300 | process_pool is 1.51x faster than zoo | 462.64 microseconds |
| thread_pool | 64 | 300 | thread_pool is 1.31x faster than zoo | 462.64 microseconds |
| asyncio_pool | 64 | 2700 | asyncio_pool is 1.04x faster than zoo | 2.884 milliseconds |
| bare_thread | 64 | 2700 | bare_thread is 1.05x faster than zoo | 2.884 milliseconds |
| process_pool | 64 | 2700 | process_pool is 2.09x faster than zoo | 2.884 milliseconds |
| thread_pool | 64 | 2700 | thread_pool is 1.09x faster than zoo | 2.884 milliseconds |
| asyncio_pool | 64 | 10000 | asyncio_pool is 1.06x faster than zoo | 10.447 milliseconds |
| bare_thread | 64 | 10000 | bare_thread is 1.10x faster than zoo | 10.447 milliseconds |
| process_pool | 64 | 10000 | process_pool is 2.22x faster than zoo | 10.447 milliseconds |
data: Openly published unfavourable data
Openly published unfavourable data
the native-task line is a line of its own and is not mixed into the table above: at its judged concurrency 1 the native form is slower on R1 and the routing form is slower than pure interpretation on R1, R8; both are listed with equal prominence, from the same paired comparison of the same run, in the "Native task line: three execution forms of the same subject" section
data: Openly published unfavourable data
zoo-bench report
Tiers where the two sides cannot be told apart: the difference is smaller than that tier's band. The band comes from the two sides' own across-round spread (stdev / median of the per-task medians) within the same run, so it varies with the sample and the reader can recompute it from the archived per-round samples. It also covers every measured tier and states a reason for each - this section is not a place to hide things: reporting noise-level differences as '1.00x faster' is.
criterion: band = the framework's own across-round relative spread plus the baseline's; a single side's across-round relative spread = stdev / median of that unit's per-round per-task medians
band this run: 1.3% to 50.0% (it varies with each tier's spread).
data: tiers with no winner
tiers with no winner
| baseline | concurrency | body tier (microseconds) | ratio | reason |
|---|---|---|---|---|
| asyncio_pool | 1 | 40 | 0.94x | the two sides differ by 5.8%, less than the band of 19.9% - no winner |
| bare_thread | 1 | 40 | 0.96x | the two sides differ by 3.9%, less than the band of 19.5% - no winner |
| asyncio_pool | 1 | 300 | 0.94x | the two sides differ by 6.1%, less than the band of 7.9% - no winner |
| bare_thread | 1 | 300 | 0.95x | the two sides differ by 5.4%, less than the band of 7.7% - no winner |
| asyncio_pool | 1 | 2700 | 0.98x | the two sides differ by 2.0%, less than the band of 3.2% - no winner |
| thread_pool | 1 | 2700 | 0.97x | the two sides differ by 3.2%, less than the band of 3.4% - no winner |
| apscheduler | 1 | 10000 | 1.01x | the two sides differ by 0.7%, less than the band of 1.3% - no winner |
| process_pool | 1 | 10000 | 0.99x | the two sides differ by 1.0%, less than the band of 2.6% - no winner |
| asyncio_pool | 4 | 40 | 0.93x | the two sides differ by 6.9%, less than the band of 21.6% - no winner |
| bare_thread | 4 | 40 | 0.91x | the two sides differ by 9.4%, less than the band of 13.9% - no winner |
| process_pool | 4 | 40 | 0.96x | the two sides differ by 4.2%, less than the band of 31.7% - no winner |
| asyncio_pool | 4 | 300 | 0.94x | the two sides differ by 6.0%, less than the band of 7.6% - no winner |
| apscheduler | 4 | 2700 | 1.00x | the two sides differ by 0.1%, less than the band of 2.4% - no winner |
data: tiers with no winner
tiers with no winner
For one conclusion per slide, only the first 2 slides of this section are shown; the remaining 1 slides of per-unit numbers, percentiles and raw samples sit in the same section of the full report, verbatim checkable.
full report: the "tiers with no winner" section of report.md in the same directory
zoo-bench report
data: caliber limitations and sources of bias
caliber limitations and sources of bias
data: caliber limitations and sources of bias
caliber limitations and sources of bias
For one conclusion per slide, only the first 2 slides of this section are shown; the remaining 4 slides of per-unit numbers, percentiles and raw samples sit in the same section of the full report, verbatim checkable.
full report: the "caliber limitations and sources of bias" section of report.md in the same directory
zoo-bench report
the baselines of this harness are open: implement the four methods of zoo_bench.adapters.BaseAdapter (setup / submit / drain / teardown), register with zoo_bench.adapters.registry.register, or list your module path in extra_modules of matrix.yaml - no file in this repository needs to change. Your implementation goes through the same equivalence verification (submit N bodies, assert all ran and each exactly once);
failing it means the data is not trusted. We deliberately write this path into the report: a report written by the framework's own maintainer, measuring that framework, gives every reason to suspect a slowed baseline or a chosen caliber; letting anyone submit their own baseline is what makes this report challengeable and falsifiable.
data: bring your own baseline
zoo-bench report
data: self-check
self-check
data: self-check
appendix
slides are compressed for one conclusion per page; only the layout is compressed, never the numbers.
results/zoo-framework-dev/20261011T094251Z.jsonthe details run over a hundred rows; squeezing them into slides would strip readers of the means to verify.