Skip to content

Commit

Permalink
[PR #10095/fcce1bf6 backport][3.11] Add a benchmark for web.FileRespo…
Browse files Browse the repository at this point in the history
…nse (#10097)

**This is a backport of PR #10095 as merged into master
(fcce1bf).**

We didn't have any benchmarks for file responses. From the benchmarks it
turns out most of the time is creating and processing the executor jobs.

If we combine the stat into a job that returns the open fileobj it will
likely be faster and solve
#8013

Co-authored-by: J. Nick Koston <nick@koston.org>
  • Loading branch information
patchback[bot] and bdraco authored Dec 4, 2024
1 parent 86bb6ad commit c41ffc7
Showing 1 changed file with 64 additions and 0 deletions.
64 changes: 64 additions & 0 deletions tests/test_benchmarks_web_fileresponse.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
"""codspeed benchmarks for the web file responses."""

import asyncio
import pathlib

from pytest_codspeed import BenchmarkFixture

from aiohttp import web
from aiohttp.pytest_plugin import AiohttpClient


def test_simple_web_file_response(
loop: asyncio.AbstractEventLoop,
aiohttp_client: AiohttpClient,
benchmark: BenchmarkFixture,
) -> None:
"""Benchmark creating 100 simple web.FileResponse."""
response_count = 100
filepath = pathlib.Path(__file__).parent / "sample.txt"

async def handler(request: web.Request) -> web.FileResponse:
return web.FileResponse(path=filepath)

app = web.Application()
app.router.add_route("GET", "/", handler)

async def run_file_resonse_benchmark() -> None:
client = await aiohttp_client(app)
for _ in range(response_count):
await client.get("/")
await client.close()

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


def test_simple_web_file_sendfile_fallback_response(
loop: asyncio.AbstractEventLoop,
aiohttp_client: AiohttpClient,
benchmark: BenchmarkFixture,
) -> None:
"""Benchmark creating 100 simple web.FileResponse without sendfile."""
response_count = 100
filepath = pathlib.Path(__file__).parent / "sample.txt"

async def handler(request: web.Request) -> web.FileResponse:
transport = request.transport
assert transport is not None
transport._sendfile_compatible = False # type: ignore[attr-defined]
return web.FileResponse(path=filepath)

app = web.Application()
app.router.add_route("GET", "/", handler)

async def run_file_resonse_benchmark() -> None:
client = await aiohttp_client(app)
for _ in range(response_count):
await client.get("/")
await client.close()

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

0 comments on commit c41ffc7

Please sign in to comment.