diff --git a/CHANGES/9838.misc.rst b/CHANGES/9838.misc.rst new file mode 100644 index 00000000000..dc41fae1c53 --- /dev/null +++ b/CHANGES/9838.misc.rst @@ -0,0 +1 @@ +Improved performance of writing chunked payloads by reducing memory copy -- by :user:`bdraco`. diff --git a/aiohttp/http_writer.py b/aiohttp/http_writer.py index a1a9860b48d..3f2a4ecda5f 100644 --- a/aiohttp/http_writer.py +++ b/aiohttp/http_writer.py @@ -110,8 +110,9 @@ async def write( if chunk: if self.chunked: - chunk_len_pre = ("%x\r\n" % len(chunk)).encode("ascii") - chunk = chunk_len_pre + chunk + b"\r\n" + chunk = b"".join( + (f"{len(chunk):x}\r\n".encode("ascii"), chunk, b"\r\n") + ) self._write(chunk) @@ -147,13 +148,15 @@ async def write_eof(self, chunk: bytes = b"") -> None: chunk += self._compress.flush() if chunk and self.chunked: - chunk_len = ("%x\r\n" % len(chunk)).encode("ascii") - chunk = chunk_len + chunk + b"\r\n0\r\n\r\n" + chunk = b"".join( + (f"{len(chunk):x}\r\n".encode("ascii"), chunk, b"\r\n0\r\n\r\n") + ) else: if self.chunked: if chunk: - chunk_len = ("%x\r\n" % len(chunk)).encode("ascii") - chunk = chunk_len + chunk + b"\r\n0\r\n\r\n" + chunk = b"".join( + (f"{len(chunk):x}\r\n".encode("ascii"), chunk, b"\r\n0\r\n\r\n") + ) else: chunk = b"0\r\n\r\n"