Skip to content

Commit

Permalink
[PR #9954/be31bed2 backport][3.11] Add url dispatcher benchmark for r…
Browse files Browse the repository at this point in the history
…esolving 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 <[email protected]>
  • Loading branch information
patchback[bot] and asvetlov authored Nov 18, 2024
1 parent ce5225c commit 20b7a7b
Showing 1 changed file with 38 additions and 0 deletions.
38 changes: 38 additions & 0 deletions tests/test_benchmarks_web_urldispatcher.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,44 @@ def _run() -> None:
loop.run_until_complete(run_url_dispatcher_benchmark())


def test_resolve_root_route_with_many_fixed_routes(
loop: asyncio.AbstractEventLoop,
benchmark: BenchmarkFixture,
) -> None:
"""Resolve top level PlainResources route 100 times."""
resolve_count = 100

async def handler(request: web.Request) -> NoReturn:
assert False

app = web.Application()
app.router.add_route("GET", "/", handler)
for count in range(250):
app.router.add_route("GET", f"/api/server/dispatch/{count}/update", handler)
app.router.add_route("GET", f"/api/server/dispatch/{count}", handler)
app.router.add_route("GET", "/api/server/dispatch", handler)
app.router.add_route("GET", "/api/server", handler)
app.router.add_route("GET", "/api", handler)
app.freeze()
router = app.router
request = _mock_request(method="GET", path="/")

async def run_url_dispatcher_benchmark() -> Optional[web.UrlMappingMatchInfo]:
ret = None
for _ in range(resolve_count):
ret = await router.resolve(request)

return ret

ret = loop.run_until_complete(run_url_dispatcher_benchmark())
assert ret is not None
assert ret.get_info()["path"] == "/", ret.get_info()

@benchmark
def _run() -> None:
loop.run_until_complete(run_url_dispatcher_benchmark())


def test_resolve_static_root_route(
loop: asyncio.AbstractEventLoop,
benchmark: BenchmarkFixture,
Expand Down

0 comments on commit 20b7a7b

Please sign in to comment.