Skip to content

Commit 20b7a7b

Browse files
[PR #9954/be31bed2 backport][3.11] Add url dispatcher benchmark for resolving root route when exists many plain routes in the subtree (#9959)
**This is a backport of PR #9954 as merged into master (be31bed).** Yet another benchmark. There is a tree: ``` / /api /api/server /api/server/dispatch /api/server/dispatch/123 /api/server/dispatch/123/update ``` The benchmark resolves the root route `/`. If the search starts from checking deep-most resource it cold be suboptimal. Co-authored-by: Andrew Svetlov <andrew.svetlov@gmail.com>
1 parent ce5225c commit 20b7a7b

File tree

1 file changed

+38
-0
lines changed

1 file changed

+38
-0
lines changed

tests/test_benchmarks_web_urldispatcher.py

+38
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,44 @@ def _run() -> None:
6969
loop.run_until_complete(run_url_dispatcher_benchmark())
7070

7171

72+
def test_resolve_root_route_with_many_fixed_routes(
73+
loop: asyncio.AbstractEventLoop,
74+
benchmark: BenchmarkFixture,
75+
) -> None:
76+
"""Resolve top level PlainResources route 100 times."""
77+
resolve_count = 100
78+
79+
async def handler(request: web.Request) -> NoReturn:
80+
assert False
81+
82+
app = web.Application()
83+
app.router.add_route("GET", "/", handler)
84+
for count in range(250):
85+
app.router.add_route("GET", f"/api/server/dispatch/{count}/update", handler)
86+
app.router.add_route("GET", f"/api/server/dispatch/{count}", handler)
87+
app.router.add_route("GET", "/api/server/dispatch", handler)
88+
app.router.add_route("GET", "/api/server", handler)
89+
app.router.add_route("GET", "/api", handler)
90+
app.freeze()
91+
router = app.router
92+
request = _mock_request(method="GET", path="/")
93+
94+
async def run_url_dispatcher_benchmark() -> Optional[web.UrlMappingMatchInfo]:
95+
ret = None
96+
for _ in range(resolve_count):
97+
ret = await router.resolve(request)
98+
99+
return ret
100+
101+
ret = loop.run_until_complete(run_url_dispatcher_benchmark())
102+
assert ret is not None
103+
assert ret.get_info()["path"] == "/", ret.get_info()
104+
105+
@benchmark
106+
def _run() -> None:
107+
loop.run_until_complete(run_url_dispatcher_benchmark())
108+
109+
72110
def test_resolve_static_root_route(
73111
loop: asyncio.AbstractEventLoop,
74112
benchmark: BenchmarkFixture,

0 commit comments

Comments
 (0)