Skip to content

Index active providers during dependency graph traversal - #743

Merged
lesnik512 merged 1 commit into
mainfrom
refactor/walk-active-path
Nov 3, 2026
Merged

lesnik512 merged 1 commit into
mainfrom
refactor/walk-active-path

Conversation

@lesnik512

Copy link
Copy Markdown
Member

Store the path index for each active provider so cycle detection can locate the start directly. The ordered path still supplies the providers used in cycle diagnostics.

All 1,128 tests passed, including the traversal event order and cycle diagnostics tests. Ruff and ty also passed. Across three paired benchmark runs, deep-chain and wide-fan-out validation stayed within 1.1% of baseline. Shared-alias validation ranged from 4.0% slower to 1.8% faster.

@lesnik512 lesnik512 closed this Nov 3, 2026
@lesnik512 lesnik512 reopened this Nov 3, 2026

@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: 26f6893 Previous: 97bcd5d Ratio
benchmarks/test_guard_by_type.py::test_g16_resolve_by_type 5189617.195156841 iter/sec (stddev: 5.793272894927075e-9) 3699850.9255874944 iter/sec (stddev: 1.376854715789107e-8) 0.71
benchmarks/test_guard_by_type.py::test_g17_resolve_by_type_large_registry 5159998.658428732 iter/sec (stddev: 1.1335113453453346e-8) 3508592.9300299203 iter/sec (stddev: 2.5891891337702616e-8) 0.68
benchmarks/test_guard_cold.py::test_g8_cold_first_resolve 22355.300123513254 iter/sec (stddev: 0.00003995491631742121) 14165.19362577081 iter/sec (stddev: 0.000060649980088460166) 0.63
benchmarks/test_guard_cold.py::test_g8b_cold_first_resolve_cached 18194.68811602397 iter/sec (stddev: 0.00011645938706598598) 11357.723740936732 iter/sec (stddev: 0.00026127632918110984) 0.62
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[1] 672.8339465077889 iter/sec (stddev: 0.000013747259729972299) 422.04808962536663 iter/sec (stddev: 0.00012601608327816885) 0.63
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[2] 652.1369451464437 iter/sec (stddev: 0.00001896018245175829) 423.628515795218 iter/sec (stddev: 0.0001446679735805736) 0.65
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[4] 566.8650986165928 iter/sec (stddev: 0.0001345641711884285) 404.2998584103321 iter/sec (stddev: 0.000092606182422299) 0.71
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[1] 19564.057370489107 iter/sec (stddev: 0.000006637850687104273) 13491.087618588588 iter/sec (stddev: 0.00001199873573007289) 0.69
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[2] 9500.887501748066 iter/sec (stddev: 0.000013458993430111735) 6670.13439540484 iter/sec (stddev: 0.000023909310520331817) 0.70
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[4] 5015.662241292991 iter/sec (stddev: 0.00002667907868259121) 3599.650689929737 iter/sec (stddev: 0.00003635546645356621) 0.72
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[1] 15203.398668368141 iter/sec (stddev: 0.000008048256242517847) 10358.50080732401 iter/sec (stddev: 0.000014073774178185547) 0.68
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[2] 6789.672907647525 iter/sec (stddev: 0.000015578904971176883) 4371.102365446031 iter/sec (stddev: 0.000019782923858144132) 0.64
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[4] 2982.241793892738 iter/sec (stddev: 0.000040819432842802524) 2067.4041637129326 iter/sec (stddev: 0.00004360325316261725) 0.69
benchmarks/test_guard_concurrency.py::test_g15c_worker_pool_floor_control[1] 51453.78378002459 iter/sec (stddev: 0.0000027030242347736175) 40558.8605372135 iter/sec (stddev: 0.000005084817026047298) 0.79
benchmarks/test_guard_concurrency.py::test_g15c_worker_pool_floor_control[2] 21591.45194423785 iter/sec (stddev: 0.000009457249558517034) 14060.620490376548 iter/sec (stddev: 0.000017260393680348955) 0.65
benchmarks/test_guard_concurrency.py::test_g15c_worker_pool_floor_control[4] 8371.54945666164 iter/sec (stddev: 0.0000236077851602294) 6358.909237195522 iter/sec (stddev: 0.000028349052225105085) 0.76
benchmarks/test_guard_lifecycle.py::test_g6_build_child_container 2193383.494197578 iter/sec (stddev: 2.0540451761717617e-8) 1586480.4577673606 iter/sec (stddev: 3.762009590005746e-8) 0.72
benchmarks/test_guard_lifecycle.py::test_g6b_build_child_container_auto_scope 2335402.986917636 iter/sec (stddev: 1.4545049695973068e-8) 1616806.5096739451 iter/sec (stddev: 3.434303966440814e-8) 0.69
benchmarks/test_guard_lifecycle.py::test_g7_request_lifecycle_batch 4578.4755126225 iter/sec (stddev: 0.00000631844764542717) 3207.9407538232276 iter/sec (stddev: 0.000011231566584996495) 0.70
benchmarks/test_guard_lifecycle.py::test_g7c_event_loop_floor_control 75764.41274852087 iter/sec (stddev: 0.0000010497869344239253) 54913.80818764173 iter/sec (stddev: 0.0000023437217869468475) 0.72
benchmarks/test_guard_lifecycle.py::test_g7b_request_cycle_sync 578380.6406362826 iter/sec (stddev: 5.489243961645404e-8) 413011.71092513134 iter/sec (stddev: 9.211248300820136e-8) 0.71
benchmarks/test_guard_lifecycle.py::test_g13_teardown_at_scale 91617.17004901139 iter/sec (stddev: 9.143291628232096e-7) 62777.69099313747 iter/sec (stddev: 0.0000016468032451379733) 0.69
benchmarks/test_guard_lifecycle.py::test_g13b_teardown_at_scale_async_no_finalizers 801.0878278798929 iter/sec (stddev: 0.0010601933574744583) 553.2167596549203 iter/sec (stddev: 0.0013037444848985635) 0.69
benchmarks/test_guard_resolve.py::test_g1_transient_resolve 3031758.963732561 iter/sec (stddev: 3.105548521005536e-8) 1937385.539864514 iter/sec (stddev: 3.124409297417119e-8) 0.64
benchmarks/test_guard_resolve.py::test_g2_cached_resolve 4789634.6940342765 iter/sec (stddev: 2.3318018044761813e-8) 3047407.203467646 iter/sec (stddev: 3.44390870855922e-8) 0.64
benchmarks/test_guard_resolve.py::test_g3_deep_chain 1179503.6819575788 iter/sec (stddev: 3.068169931122921e-8) 767261.3568814585 iter/sec (stddev: 7.86118308454073e-8) 0.65
benchmarks/test_guard_resolve.py::test_g4_wide_resolve 592397.6191713023 iter/sec (stddev: 3.22664364048933e-7) 452242.8293440293 iter/sec (stddev: 4.04487202774168e-7) 0.76
benchmarks/test_guard_resolve.py::test_g5_cross_scope 2736441.735006388 iter/sec (stddev: 1.759045243700755e-8) 1705023.8057325385 iter/sec (stddev: 5.593521759980956e-8) 0.62
benchmarks/test_guard_resolve.py::test_g9_context_resolve 2033093.8890666456 iter/sec (stddev: 1.1757410237211872e-7) 1387244.61867959 iter/sec (stddev: 1.427218339492765e-7) 0.68
benchmarks/test_guard_resolve.py::test_g12_override_active_resolve 1167753.4461335542 iter/sec (stddev: 2.3782576121366854e-8) 762986.4587083632 iter/sec (stddev: 4.902203981247507e-8) 0.65
benchmarks/test_guard_resolve.py::test_g18_alias_hop 5048142.8766381545 iter/sec (stddev: 4.713303637124033e-9) 2807898.889157946 iter/sec (stddev: 1.3550385106235307e-8) 0.56
benchmarks/test_guard_validate.py::test_g10_validate_deep_chain 64105.99952742538 iter/sec (stddev: 0.0000014410012437698801) 40087.41890190946 iter/sec (stddev: 0.0000035421063046108555) 0.63
benchmarks/test_guard_validate.py::test_g11_validate_wide 37319.24609778009 iter/sec (stddev: 0.0000017440728975806487) 23917.250331925698 iter/sec (stddev: 0.000005996614565270314) 0.64
benchmarks/test_guard_validate.py::test_g11b_validate_shared_alias_chain 3852.042527771898 iter/sec (stddev: 0.000009884365119327207) 2589.186688837534 iter/sec (stddev: 0.00001643739005892647) 0.67

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

@lesnik512
lesnik512 merged commit 97bcd5d into main Nov 3, 2026
12 checks passed
@lesnik512
lesnik512 deleted the refactor/walk-active-path branch November 3, 2026 05:02
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