Skip to content

Commit 8b9888d

Browse files
[PR #10749/d702fb30 backport][3.11] Add compressed binary WebSocket roundtrip benchmark (#10750)
Co-authored-by: J. Nick Koston <[email protected]>
1 parent 1d00bd2 commit 8b9888d

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed

tests/test_benchmarks_client_ws.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,3 +105,67 @@ async def run_websocket_benchmark() -> None:
105105
@benchmark
106106
def _run() -> None:
107107
loop.run_until_complete(run_websocket_benchmark())
108+
109+
110+
def test_client_send_large_websocket_compressed_messages(
111+
loop: asyncio.AbstractEventLoop,
112+
aiohttp_client: AiohttpClient,
113+
benchmark: BenchmarkFixture,
114+
) -> None:
115+
"""Benchmark send of compressed WebSocket binary messages."""
116+
message_count = 10
117+
raw_message = b"x" * 2**19 # 512 KiB
118+
119+
async def handler(request: web.Request) -> web.WebSocketResponse:
120+
ws = web.WebSocketResponse()
121+
await ws.prepare(request)
122+
for _ in range(message_count):
123+
await ws.receive()
124+
await ws.close()
125+
return ws
126+
127+
app = web.Application()
128+
app.router.add_route("GET", "/", handler)
129+
130+
async def run_websocket_benchmark() -> None:
131+
client = await aiohttp_client(app)
132+
resp = await client.ws_connect("/", compress=15)
133+
for _ in range(message_count):
134+
await resp.send_bytes(raw_message)
135+
await resp.close()
136+
137+
@benchmark
138+
def _run() -> None:
139+
loop.run_until_complete(run_websocket_benchmark())
140+
141+
142+
def test_client_receive_large_websocket_compressed_messages(
143+
loop: asyncio.AbstractEventLoop,
144+
aiohttp_client: AiohttpClient,
145+
benchmark: BenchmarkFixture,
146+
) -> None:
147+
"""Benchmark receive of compressed WebSocket binary messages."""
148+
message_count = 10
149+
raw_message = b"x" * 2**19 # 512 KiB
150+
151+
async def handler(request: web.Request) -> web.WebSocketResponse:
152+
ws = web.WebSocketResponse()
153+
await ws.prepare(request)
154+
for _ in range(message_count):
155+
await ws.send_bytes(raw_message)
156+
await ws.close()
157+
return ws
158+
159+
app = web.Application()
160+
app.router.add_route("GET", "/", handler)
161+
162+
async def run_websocket_benchmark() -> None:
163+
client = await aiohttp_client(app)
164+
resp = await client.ws_connect("/", compress=15)
165+
for _ in range(message_count):
166+
await resp.receive()
167+
await resp.close()
168+
169+
@benchmark
170+
def _run() -> None:
171+
loop.run_until_complete(run_websocket_benchmark())

0 commit comments

Comments
 (0)