Skip to content

docs: regenerate the performance tables after the per-factory code change - #708

Merged
lesnik512 merged 1 commit into
mainfrom
docs/performance-tables-after-code-per-factory
Oct 17, 2026
Merged

lesnik512 merged 1 commit into
mainfrom
docs/performance-tables-after-code-per-factory

Conversation

@lesnik512

Copy link
Copy Markdown
Member

Regenerates the comparison tables in docs/introduction/performance.md from main at 473ce2a, so they include #694 (each factory gets its own copy of its resolver code).

C3 (six-deep chain) dropped from about 760 ns to 552-557 ns. Against dishka, modern-di's C3 ratio went from 1.21 to 0.87, so modern-di is now faster on every scenario except the warm singleton lookup. The other cells moved by a few percent at most.

Changes:

  • The tables are pasted unedited from just bench-report (5 runs).
  • The intro now says modern-di is slower only on the warm singleton lookup. The request-cycle figure is 1.66 µs instead of 1.74 µs, here and in comparison.md.
  • The measurement line has the new date, commit and baseline (4.1.0 plus unreleased main). The machine, Python and rival versions are unchanged.
  • The C2/C3 caveat drops "or why dishka wins C3". Two numbers in the caveats follow the new data: dependency-injector's C2 is 67 ns, and the C4 event-loop floor is about 18% of modern-di's time.

The machine had a load average of about 2.8 and was about 85% idle during the run. modern-di spreads are within 1.7% (previously 1.4%) and rival spreads within 4.7% (previously 3.8%). The widest cell is C6 against wireup at ±4.2%. All C3 cells are within 1.5%. Earlier runs on a busier machine had wider spreads, but their medians matched these to within 1-2%, and the C3 ratio against dishka was 0.87-0.88 every time.

Checked: just lint-ci, just test-docs (218 passed), tests/test_bench_report.py, and just docs-build.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Details
Benchmark suite Current: 54f1e1c Previous: 1fe9404 Ratio
benchmarks/test_guard_by_type.py::test_g16_resolve_by_type 3320957.012132102 iter/sec (stddev: 1.1938086467269671e-8) 5178696.623565742 iter/sec (stddev: 5.414322976795206e-9) 1.56
benchmarks/test_guard_by_type.py::test_g17_resolve_by_type_large_registry 3331223.78035057 iter/sec (stddev: 1.4790890137353807e-8) 5173048.561866323 iter/sec (stddev: 4.944868870356742e-9) 1.55
benchmarks/test_guard_cold.py::test_g8_cold_first_resolve 16023.527758702754 iter/sec (stddev: 0.000052008717808257516) 23341.89100892437 iter/sec (stddev: 0.000040957484774952956) 1.46
benchmarks/test_guard_cold.py::test_g8b_cold_first_resolve_cached 12713.762094084948 iter/sec (stddev: 0.0001280532705323862) 18128.971481425186 iter/sec (stddev: 0.000230226555941953) 1.43
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[1] 472.5629558719837 iter/sec (stddev: 0.000050515451875524175) 500.63779365711235 iter/sec (stddev: 0.00009568522495976157) 1.06
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[2] 469.9766829201808 iter/sec (stddev: 0.000055153807276442504) 557.5535854996675 iter/sec (stddev: 0.00010071569364556589) 1.19
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[4] 403.82844280480515 iter/sec (stddev: 0.00013292801451865268) 569.4122020523743 iter/sec (stddev: 0.00016102760266743736) 1.41
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[1] 13476.606127693349 iter/sec (stddev: 0.00000759092088704966) 18760.14220174014 iter/sec (stddev: 0.000007857094267724099) 1.39
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[2] 6345.95379609425 iter/sec (stddev: 0.000020953630848694298) 9555.709667947016 iter/sec (stddev: 0.000018284080800311374) 1.51
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[4] 3329.988267618312 iter/sec (stddev: 0.00004192420271874652) 4955.91200034446 iter/sec (stddev: 0.00003013749565134662) 1.49
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[1] 9976.021800224114 iter/sec (stddev: 0.000009628038301447758) 14076.259543718805 iter/sec (stddev: 0.00000931467062375488) 1.41
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[2] 4183.459333861973 iter/sec (stddev: 0.000017172115705238353) 5964.930088272373 iter/sec (stddev: 0.00002430283539827365) 1.43
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[4] 2010.368879564 iter/sec (stddev: 0.00005464951550704635) 2879.198822617753 iter/sec (stddev: 0.00011444513604976574) 1.43
benchmarks/test_guard_concurrency.py::test_g15c_worker_pool_floor_control[1] 39496.82363229264 iter/sec (stddev: 0.0000048353516943913426) 53280.05327926116 iter/sec (stddev: 0.0000025629815202707525) 1.35
benchmarks/test_guard_concurrency.py::test_g15c_worker_pool_floor_control[2] 13882.954889705179 iter/sec (stddev: 0.000013290440313554477) 21659.336184542513 iter/sec (stddev: 0.000008141698894717914) 1.56
benchmarks/test_guard_concurrency.py::test_g15c_worker_pool_floor_control[4] 5681.8711803694405 iter/sec (stddev: 0.00003530451251352048) 8611.282200507329 iter/sec (stddev: 0.000020640219845949377) 1.52
benchmarks/test_guard_lifecycle.py::test_g6_build_child_container 1580052.2823424013 iter/sec (stddev: 3.175697902027839e-8) 2206752.6410179175 iter/sec (stddev: 1.7192874583285688e-8) 1.40
benchmarks/test_guard_lifecycle.py::test_g6b_build_child_container_auto_scope 1687703.3260639743 iter/sec (stddev: 3.165939020217187e-8) 2363877.0278010173 iter/sec (stddev: 1.894917431566577e-8) 1.40
benchmarks/test_guard_lifecycle.py::test_g7_request_lifecycle_batch 3112.708671961348 iter/sec (stddev: 0.00001596420956953311) 4439.610302361827 iter/sec (stddev: 0.00000816229810846762) 1.43
benchmarks/test_guard_lifecycle.py::test_g7c_event_loop_floor_control 57724.27277025886 iter/sec (stddev: 0.0000018466475476650607) 75806.40753304795 iter/sec (stddev: 0.0000013101134732601992) 1.31
benchmarks/test_guard_lifecycle.py::test_g7b_request_cycle_sync 411245.5676206241 iter/sec (stddev: 8.85694235703082e-8) 581927.8974458397 iter/sec (stddev: 6.294860146637674e-8) 1.42
benchmarks/test_guard_lifecycle.py::test_g13_teardown_at_scale 65077.86985603879 iter/sec (stddev: 0.0000015488741927788382) 94302.42871685681 iter/sec (stddev: 0.0000010347080417754609) 1.45
benchmarks/test_guard_lifecycle.py::test_g13b_teardown_at_scale_async_no_finalizers 598.6968247486334 iter/sec (stddev: 0.000894760853536026) 826.6166310205344 iter/sec (stddev: 0.0011973141997795621) 1.38
benchmarks/test_guard_resolve.py::test_g1_transient_resolve 2160796.4220575644 iter/sec (stddev: 3.726822866003395e-8) 3000560.8798204404 iter/sec (stddev: 2.072957044357824e-8) 1.39
benchmarks/test_guard_resolve.py::test_g2_cached_resolve 3614360.06940675 iter/sec (stddev: 9.973134000850693e-9) 5069344.578366031 iter/sec (stddev: 6.151691670543562e-9) 1.40
benchmarks/test_guard_resolve.py::test_g3_deep_chain 782061.8321164199 iter/sec (stddev: 4.228180980032576e-8) 1098187.3073185228 iter/sec (stddev: 4.228505498554438e-8) 1.40
benchmarks/test_guard_resolve.py::test_g4_wide_resolve 466410.8511975815 iter/sec (stddev: 3.9888615274337577e-7) 609703.083134297 iter/sec (stddev: 3.6902082541952153e-7) 1.31
benchmarks/test_guard_resolve.py::test_g5_cross_scope 1991335.9957706158 iter/sec (stddev: 2.3053799842117716e-8) 2606734.7076500254 iter/sec (stddev: 2.6237384655609e-8) 1.31
benchmarks/test_guard_resolve.py::test_g9_context_resolve 1410167.9809713834 iter/sec (stddev: 1.5103813896160022e-7) 1994396.9412285434 iter/sec (stddev: 1.473883486223868e-7) 1.41
benchmarks/test_guard_resolve.py::test_g12_override_active_resolve 829698.8719836429 iter/sec (stddev: 4.9745572981974815e-8) 1159115.7615864046 iter/sec (stddev: 4.834304288025477e-8) 1.40
benchmarks/test_guard_resolve.py::test_g18_alias_hop 3610433.763633581 iter/sec (stddev: 1.3868370165643838e-8) 5004418.150554741 iter/sec (stddev: 4.873760874431247e-9) 1.39
benchmarks/test_guard_validate.py::test_g10_validate_deep_chain 35403.2120202192 iter/sec (stddev: 0.000018852325711566874) 53893.052686058494 iter/sec (stddev: 0.000015060637075350605) 1.52
benchmarks/test_guard_validate.py::test_g11_validate_wide 21224.238258441233 iter/sec (stddev: 0.000023332802985458138) 31556.14456620828 iter/sec (stddev: 0.000019401454019783594) 1.49

This comment was automatically generated by workflow using github-action-benchmark.

@lesnik512
lesnik512 merged commit 27831b8 into main Oct 17, 2026
12 checks passed
@lesnik512
lesnik512 deleted the docs/performance-tables-after-code-per-factory branch October 17, 2026 14:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant