Skip to content

refactor: reuse effective scope lookups during validation - #740

Merged
lesnik512 merged 1 commit into
mainfrom
refactor/validation-scope-lookup
Nov 3, 2026
Merged

lesnik512 merged 1 commit into
mainfrom
refactor/validation-scope-lookup

Conversation

@lesnik512

Copy link
Copy Markdown
Member

Summary

  • Reuse effective scope owners for aliases and derived providers within one validation walk.
  • Preserve diagnostic order, cycle reporting, the container-provider exemption, and scope enum identity checks.
  • Add a benchmark for 100 factories sharing a three-hop alias chain.

The first lookup per alias or derived provider still uses the existing scope-chain traversal to preserve its cycle semantics.

Verification

  • 1,127 tests passed. Ruff and ty passed.
  • Median validation time across three alternating baseline and candidate runs fell by 6.9% for the deep chain, 8.6% for the wide graph, and 25.8% for the shared alias chain.

@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: 132efb6 Previous: 192a33b Ratio
benchmarks/test_guard_by_type.py::test_g16_resolve_by_type 7131082.198069591 iter/sec (stddev: 5.483374335489307e-9) 3737504.7274780427 iter/sec (stddev: 1.1860166916965754e-8) 0.52
benchmarks/test_guard_by_type.py::test_g17_resolve_by_type_large_registry 7057294.504315731 iter/sec (stddev: 3.6777668558227816e-9) 3310532.1534818243 iter/sec (stddev: 3.0625070738830345e-8) 0.47
benchmarks/test_guard_cold.py::test_g8_cold_first_resolve 27678.206520432544 iter/sec (stddev: 0.00017524448959892593) 14640.713957256086 iter/sec (stddev: 0.000056589556828772236) 0.53
benchmarks/test_guard_cold.py::test_g8b_cold_first_resolve_cached 25031.69081345745 iter/sec (stddev: 0.00003491480385073811) 11564.366479109463 iter/sec (stddev: 0.00022442683144522382) 0.46
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[1] 894.2030384139529 iter/sec (stddev: 0.00011072443877819967) 423.364458398383 iter/sec (stddev: 0.00017396384945062658) 0.47
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[2] 898.571339496315 iter/sec (stddev: 0.00001735865652853978) 372.90683763817896 iter/sec (stddev: 0.00017708649097530064) 0.41
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[4] 839.9820948293257 iter/sec (stddev: 0.000021077848732315485) 390.49543993280724 iter/sec (stddev: 0.00012331223341308537) 0.46
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[1] 24982.564251868527 iter/sec (stddev: 0.000006074293853782568) 12421.939754497993 iter/sec (stddev: 0.000014373374783546692) 0.50
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[2] 11954.944206245056 iter/sec (stddev: 0.000014495667053677346) 6548.513653911986 iter/sec (stddev: 0.000021374652457352427) 0.55
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[4] 6363.312364948396 iter/sec (stddev: 0.00002131397892266697) 3563.5953434056664 iter/sec (stddev: 0.00003826468150468733) 0.56
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[1] 19454.022848752564 iter/sec (stddev: 0.000006904298429635416) 10125.473176033667 iter/sec (stddev: 0.000013298326326468386) 0.52
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[2] 9559.146501961653 iter/sec (stddev: 0.000010014619491155779) 4241.574792061419 iter/sec (stddev: 0.00002166407204502503) 0.44
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[4] 4139.77194823346 iter/sec (stddev: 0.000028533798242518525) 2083.358832772652 iter/sec (stddev: 0.000057276169576878695) 0.50
benchmarks/test_guard_concurrency.py::test_g15c_worker_pool_floor_control[1] 59068.48991516746 iter/sec (stddev: 0.0000011957798831735738) 40073.50817482459 iter/sec (stddev: 0.000004654593526005983) 0.68
benchmarks/test_guard_concurrency.py::test_g15c_worker_pool_floor_control[2] 31591.808559707963 iter/sec (stddev: 0.000008133351069252143) 13275.729941491543 iter/sec (stddev: 0.000017239686313531118) 0.42
benchmarks/test_guard_concurrency.py::test_g15c_worker_pool_floor_control[4] 11561.220468027797 iter/sec (stddev: 0.00001967156163558514) 6132.88771772826 iter/sec (stddev: 0.00002989928556680089) 0.53
benchmarks/test_guard_lifecycle.py::test_g6_build_child_container 3089383.0339978472 iter/sec (stddev: 1.7179269024744533e-8) 1512736.923444638 iter/sec (stddev: 4.635931905645066e-8) 0.49
benchmarks/test_guard_lifecycle.py::test_g6b_build_child_container_auto_scope 3448242.5686977217 iter/sec (stddev: 8.5456067747462e-9) 1561924.5284170664 iter/sec (stddev: 4.47374263645997e-8) 0.45
benchmarks/test_guard_lifecycle.py::test_g7_request_lifecycle_batch 6794.568278018158 iter/sec (stddev: 0.000004608373863488824) 3310.4943084539314 iter/sec (stddev: 0.00001118650112152193) 0.49
benchmarks/test_guard_lifecycle.py::test_g7c_event_loop_floor_control 113465.40249976916 iter/sec (stddev: 7.695493639340694e-7) 58452.05198439162 iter/sec (stddev: 0.000002173116296098128) 0.52
benchmarks/test_guard_lifecycle.py::test_g7b_request_cycle_sync 844823.3176673786 iter/sec (stddev: 3.4047171980432165e-8) 421615.75044971926 iter/sec (stddev: 7.016932158044157e-8) 0.50
benchmarks/test_guard_lifecycle.py::test_g13_teardown_at_scale 130714.2419920145 iter/sec (stddev: 6.045162688468458e-7) 61890.0777538698 iter/sec (stddev: 0.000001582320784271455) 0.47
benchmarks/test_guard_lifecycle.py::test_g13b_teardown_at_scale_async_no_finalizers 1177.0094139968965 iter/sec (stddev: 0.0005944055178711403) 555.1895639764635 iter/sec (stddev: 0.0013037732432456632) 0.47
benchmarks/test_guard_resolve.py::test_g1_transient_resolve 4155916.6954380334 iter/sec (stddev: 2.0331360528271646e-8) 1947668.5798530343 iter/sec (stddev: 3.0822791736998147e-8) 0.47
benchmarks/test_guard_resolve.py::test_g2_cached_resolve 7093666.618372087 iter/sec (stddev: 5.564056374524533e-9) 3253249.711828917 iter/sec (stddev: 3.681921234350634e-8) 0.46
benchmarks/test_guard_resolve.py::test_g3_deep_chain 1592666.9789921886 iter/sec (stddev: 3.0235893947305696e-8) 756849.0391569673 iter/sec (stddev: 6.026001600471872e-8) 0.48
benchmarks/test_guard_resolve.py::test_g4_wide_resolve 893200.4667844686 iter/sec (stddev: 2.4222991223847764e-7) 440908.1552814229 iter/sec (stddev: 4.044106380836565e-7) 0.49
benchmarks/test_guard_resolve.py::test_g5_cross_scope 3762909.2481347746 iter/sec (stddev: 1.2539942177806843e-8) 1745399.1496641096 iter/sec (stddev: 2.731718648708508e-8) 0.46
benchmarks/test_guard_resolve.py::test_g9_context_resolve 2795049.436403197 iter/sec (stddev: 7.108930027212712e-8) 1341977.2773621103 iter/sec (stddev: 1.4235941330196433e-7) 0.48
benchmarks/test_guard_resolve.py::test_g12_override_active_resolve 1607584.196407762 iter/sec (stddev: 3.036091493493367e-8) 761788.1575422399 iter/sec (stddev: 4.558266316042538e-8) 0.47
benchmarks/test_guard_resolve.py::test_g18_alias_hop 6982826.715284019 iter/sec (stddev: 3.6431864519189546e-9) 3041641.2550073755 iter/sec (stddev: 3.372316366254938e-8) 0.44
benchmarks/test_guard_validate.py::test_g10_validate_deep_chain 84884.98607726394 iter/sec (stddev: 0.0000033300663512201664) 36440.87733042569 iter/sec (stddev: 0.0000032145705040793355) 0.43
benchmarks/test_guard_validate.py::test_g11_validate_wide 50666.37514317388 iter/sec (stddev: 0.0000012991924253417407) 21630.20885343135 iter/sec (stddev: 0.000004276831067075518) 0.43
benchmarks/test_guard_validate.py::test_g11b_validate_shared_alias_chain 5292.256288921307 iter/sec (stddev: 0.000006869014097871046)

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

@lesnik512
lesnik512 merged commit 6f2fbfe into main Nov 3, 2026
12 checks passed
@lesnik512
lesnik512 deleted the refactor/validation-scope-lookup branch November 3, 2026 04:45
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