Skip to content

Commit

Permalink
Add url dispatcher benchmark for resolving root route when exists man…
Browse files Browse the repository at this point in the history
…y plain routes in the subtree (#9954)

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.
  • Loading branch information
asvetlov authored Nov 18, 2024
1 parent 27e23fb commit be31bed
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 be31bed

Please sign in to comment.