Skip to content

Separate registration preparation from commit - #746

Merged
lesnik512 merged 1 commit into
mainfrom
refactor/registration-transaction
Nov 3, 2026
Merged

lesnik512 merged 1 commit into
mainfrom
refactor/registration-transaction

Conversation

@lesnik512

Copy link
Copy Markdown
Member

Prepare bindings and check for duplicates within the batch before taking the registry lock. Under the lock, check for conflicts with existing bindings before applying the batch. Reuse the provider identity map for inline scope discovery and registration.

Bindings Baseline median Candidate median Change
10 7.071 µs 6.463 µs −8.60%
1,000 593.839 µs 527.752 µs −11.13%

Each number is the median of 24 batch averages. Baseline and candidate ran in pairs with alternating order and a fresh registry for each timed registration.

A targeted check on both versions confirmed that a duplicate within the batch takes precedence over a conflict with an existing binding. Both rejection paths preserved registry state, cached plans and resolvers, provider registration flags, and inline scope.

  • just lint-ci passed.
  • just test-ci passed all 1,128 tests with 100% coverage.

@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: 95ec88e Previous: 47762d1 Ratio
benchmarks/test_guard_by_type.py::test_g16_resolve_by_type 5825032.904164495 iter/sec (stddev: 1.0763495641994477e-8) 3017561.9692543675 iter/sec (stddev: 1.750319466644966e-8) 0.52
benchmarks/test_guard_by_type.py::test_g17_resolve_by_type_large_registry 5359793.849479946 iter/sec (stddev: 1.1674323418188886e-8) 3193551.886603387 iter/sec (stddev: 2.816087175539433e-8) 0.60
benchmarks/test_guard_cold.py::test_g8_cold_first_resolve 18237.48348068363 iter/sec (stddev: 0.00004362140552935393) 14685.468761845292 iter/sec (stddev: 0.00005447456309794489) 0.81
benchmarks/test_guard_cold.py::test_g8b_cold_first_resolve_cached 15310.221049957443 iter/sec (stddev: 0.00013323334589192978) 11807.067806308032 iter/sec (stddev: 0.00016190215301945785) 0.77
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[1] 765.6987454762252 iter/sec (stddev: 0.000058209351915129055) 459.2152858961316 iter/sec (stddev: 0.00008432361073532243) 0.60
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[2] 737.9618231397557 iter/sec (stddev: 0.000045902655539775554) 428.3810853203458 iter/sec (stddev: 0.00011030493355702745) 0.58
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[4] 676.2048175363456 iter/sec (stddev: 0.00005889287999234795) 404.85451319140213 iter/sec (stddev: 0.0001003837692155433) 0.60
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[1] 16008.004001691881 iter/sec (stddev: 0.000013181341944233934) 14059.854440692932 iter/sec (stddev: 0.000009759135893930133) 0.88
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[2] 6746.615560389769 iter/sec (stddev: 0.000026414351538136303) 7741.972944994737 iter/sec (stddev: 0.000014542968235790703) 1.15
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[4] 3425.899814007806 iter/sec (stddev: 0.000049063673689224836) 3718.820018401797 iter/sec (stddev: 0.00004808484645685743) 1.09
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[1] 12210.095449549122 iter/sec (stddev: 0.000012687467846737394) 10442.726345250036 iter/sec (stddev: 0.000012397618336169868) 0.86
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[2] 4504.683406691154 iter/sec (stddev: 0.000029978018926461404) 4456.64210882066 iter/sec (stddev: 0.000023491495239898745) 0.99
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[4] 2242.902028134264 iter/sec (stddev: 0.00005246173280129431) 2170.236379974916 iter/sec (stddev: 0.00004376616590484128) 0.97
benchmarks/test_guard_concurrency.py::test_g15c_worker_pool_floor_control[1] 29213.968951397124 iter/sec (stddev: 0.000007225570323983183) 41030.10173493843 iter/sec (stddev: 0.000004375533860465989) 1.40
benchmarks/test_guard_concurrency.py::test_g15c_worker_pool_floor_control[2] 11540.898443358667 iter/sec (stddev: 0.000027964741921468287) 15725.275248093889 iter/sec (stddev: 0.000017288493603316113) 1.36
benchmarks/test_guard_concurrency.py::test_g15c_worker_pool_floor_control[4] 5349.412478480942 iter/sec (stddev: 0.000037611790644797865) 6733.351913674104 iter/sec (stddev: 0.00002906578871767762) 1.26
benchmarks/test_guard_lifecycle.py::test_g6_build_child_container 2189823.060131403 iter/sec (stddev: 3.221457329443893e-8) 1486358.001891102 iter/sec (stddev: 3.698056178855252e-8) 0.68
benchmarks/test_guard_lifecycle.py::test_g6b_build_child_container_auto_scope 2395369.3677489064 iter/sec (stddev: 2.5251094370875294e-8) 1531964.5944609235 iter/sec (stddev: 3.858888349715363e-8) 0.64
benchmarks/test_guard_lifecycle.py::test_g7_request_lifecycle_batch 4238.838012276708 iter/sec (stddev: 0.0000078714744160598) 3306.8672892475743 iter/sec (stddev: 0.000011730090384025869) 0.78
benchmarks/test_guard_lifecycle.py::test_g7c_event_loop_floor_control 79829.51401355462 iter/sec (stddev: 0.000001169835327682081) 58476.00058587414 iter/sec (stddev: 0.0000018725093761337473) 0.73
benchmarks/test_guard_lifecycle.py::test_g7b_request_cycle_sync 579449.6445191719 iter/sec (stddev: 8.164698250121284e-8) 419891.3799795667 iter/sec (stddev: 8.592527924840865e-8) 0.72
benchmarks/test_guard_lifecycle.py::test_g13_teardown_at_scale 87805.38697507023 iter/sec (stddev: 0.0000011148727438882223) 61720.01562354498 iter/sec (stddev: 0.000001826630671262546) 0.70
benchmarks/test_guard_lifecycle.py::test_g13b_teardown_at_scale_async_no_finalizers 756.1572492101694 iter/sec (stddev: 0.0009954953499316439) 569.684231050814 iter/sec (stddev: 0.001124787253764957) 0.75
benchmarks/test_guard_resolve.py::test_g1_transient_resolve 3089840.0343281855 iter/sec (stddev: 2.2179311371678282e-8) 1912181.4419242034 iter/sec (stddev: 2.7450713267576054e-8) 0.62
benchmarks/test_guard_resolve.py::test_g2_cached_resolve 5567170.838938043 iter/sec (stddev: 2.041792185377921e-8) 3382520.022740473 iter/sec (stddev: 2.992209972638476e-8) 0.61
benchmarks/test_guard_resolve.py::test_g3_deep_chain 1141065.9952612892 iter/sec (stddev: 4.3208908148430246e-8) 769657.7812872208 iter/sec (stddev: 6.801784431946685e-8) 0.67
benchmarks/test_guard_resolve.py::test_g4_wide_resolve 638983.9235471998 iter/sec (stddev: 3.304058828327882e-7) 445999.0385142321 iter/sec (stddev: 3.5406267222085763e-7) 0.70
benchmarks/test_guard_resolve.py::test_g5_cross_scope 2764670.1693217927 iter/sec (stddev: 2.4951764687585233e-8) 1728990.5815814778 iter/sec (stddev: 2.8517136450511702e-8) 0.63
benchmarks/test_guard_resolve.py::test_g9_context_resolve 2074355.6947361873 iter/sec (stddev: 1.1000105317995128e-7) 1328038.2676845235 iter/sec (stddev: 1.1910436088659929e-7) 0.64
benchmarks/test_guard_resolve.py::test_g12_override_active_resolve 1167545.867633534 iter/sec (stddev: 5.4670579085453675e-8) 761668.45608028 iter/sec (stddev: 5.2302930671084444e-8) 0.65
benchmarks/test_guard_resolve.py::test_g18_alias_hop 5639605.09677439 iter/sec (stddev: 1.1321169623216522e-8) 3110833.749172728 iter/sec (stddev: 3.5064059361052834e-8) 0.55
benchmarks/test_guard_validate.py::test_g10_validate_deep_chain 48936.33132036656 iter/sec (stddev: 0.0000019980959940739257) 40655.41020444628 iter/sec (stddev: 0.0000032667671806641557) 0.83
benchmarks/test_guard_validate.py::test_g11_validate_wide 30832.42585772745 iter/sec (stddev: 0.0000025469652930272814) 24545.011574980257 iter/sec (stddev: 0.000003816456833149239) 0.80
benchmarks/test_guard_validate.py::test_g11b_validate_shared_alias_chain 3199.5350725746307 iter/sec (stddev: 0.000014150051518969756) 2601.3754698218127 iter/sec (stddev: 0.00003560513428487841) 0.81

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

@lesnik512
lesnik512 merged commit b1f29b6 into main Nov 3, 2026
12 checks passed
@lesnik512
lesnik512 deleted the refactor/registration-transaction branch November 3, 2026 05:26
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