Skip to content

Commit 4f50d00

Browse files
committed
Add benchmarks for the URL dispatcher
for checking #9907 impact
1 parent 2249f2d commit 4f50d00

File tree

1 file changed

+133
-0
lines changed

1 file changed

+133
-0
lines changed
+133
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
"""codspeed benchmarks for the URL dispatcher."""
2+
3+
import asyncio
4+
from typing import NoReturn
5+
from unittest import mock
6+
7+
from multidict import CIMultiDict, CIMultiDictProxy
8+
from pytest_codspeed import BenchmarkFixture
9+
from yarl import URL
10+
11+
from aiohttp import web
12+
from aiohttp.http import HttpVersion, RawRequestMessage
13+
14+
15+
def _mock_request(method: str, path: str) -> web.Request:
16+
message = RawRequestMessage(
17+
method,
18+
path,
19+
HttpVersion(1, 1),
20+
CIMultiDictProxy(CIMultiDict()),
21+
(),
22+
False,
23+
None,
24+
False,
25+
False,
26+
URL(path),
27+
)
28+
29+
return web.Request(
30+
message, mock.Mock(), mock.Mock(), mock.Mock(), mock.Mock(), mock.Mock()
31+
)
32+
33+
34+
def test_resolve_root_route(
35+
loop: asyncio.AbstractEventLoop,
36+
benchmark: BenchmarkFixture,
37+
) -> None:
38+
"""Resolve top level PlainResources route 100 times."""
39+
resolve_count = 100
40+
41+
async def handler(request: web.Request) -> NoReturn:
42+
assert False
43+
44+
app = web.Application()
45+
app.router.add_route("GET", "/", handler)
46+
request = _mock_request(method="GET", path="/")
47+
48+
async def run_url_dispatcher_benchmark() -> None:
49+
for _ in range(resolve_count):
50+
await app._router.resolve(request)
51+
52+
@benchmark
53+
def _run() -> None:
54+
loop.run_until_complete(run_url_dispatcher_benchmark())
55+
56+
57+
def test_resolve_single_fixed_url_with_many_routes(
58+
loop: asyncio.AbstractEventLoop,
59+
benchmark: BenchmarkFixture,
60+
) -> None:
61+
"""Resolve PlainResources route 100 times."""
62+
resolve_count = 100
63+
64+
async def handler(request: web.Request) -> NoReturn:
65+
assert False
66+
67+
app = web.Application()
68+
for count in range(250):
69+
app.router.add_route("GET", f"/api/server/dispatch/{count}/update", handler)
70+
request = _mock_request(method="GET", path="/api/server/dispatch/1/update")
71+
72+
async def run_url_dispatcher_benchmark() -> None:
73+
for _ in range(resolve_count):
74+
await app._router.resolve(request)
75+
76+
@benchmark
77+
def _run() -> None:
78+
loop.run_until_complete(run_url_dispatcher_benchmark())
79+
80+
81+
def test_resolve_multiple_fixed_url_with_many_routes(
82+
loop: asyncio.AbstractEventLoop,
83+
benchmark: BenchmarkFixture,
84+
) -> None:
85+
"""Resolve 250 different PlainResources routes."""
86+
87+
async def handler(request: web.Request) -> NoReturn:
88+
assert False
89+
90+
app = web.Application()
91+
for count in range(250):
92+
app.router.add_route("GET", f"/api/server/dispatch/{count}/update", handler)
93+
94+
requests = [
95+
_mock_request(method="GET", path=f"/api/server/dispatch/{count}/update")
96+
for count in range(250)
97+
]
98+
99+
async def run_url_dispatcher_benchmark() -> None:
100+
for request in requests:
101+
await app._router.resolve(request)
102+
103+
@benchmark
104+
def _run() -> None:
105+
loop.run_until_complete(run_url_dispatcher_benchmark())
106+
107+
108+
def test_resolve_dynamic_resource_url_with_many_routes(
109+
loop: asyncio.AbstractEventLoop,
110+
benchmark: BenchmarkFixture,
111+
) -> None:
112+
"""Resolve different a DynamicResource when there are 250 PlainResources registered."""
113+
114+
async def handler(request: web.Request) -> NoReturn:
115+
assert False
116+
117+
app = web.Application()
118+
for count in range(250):
119+
app.router.add_route("GET", f"/api/server/other/{count}/update", handler)
120+
app.router.add_route("GET", "/api/server/dispatch/{customer}/update", handler)
121+
122+
requests = [
123+
_mock_request(method="GET", path=f"/api/server/dispatch/{customer}/update")
124+
for customer in range(250)
125+
]
126+
127+
async def run_url_dispatcher_benchmark() -> None:
128+
for request in requests:
129+
await app._router.resolve(request)
130+
131+
@benchmark
132+
def _run() -> None:
133+
loop.run_until_complete(run_url_dispatcher_benchmark())

0 commit comments

Comments
 (0)