From fe16669f0a4446937213f373140865c728b9b942 Mon Sep 17 00:00:00 2001 From: Dmitry Dygalo Date: Sun, 9 Nov 2025 14:56:54 +0100 Subject: [PATCH] perf: Write directly to file descriptor Signed-off-by: Dmitry Dygalo --- src/harfile/__init__.py | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/src/harfile/__init__.py b/src/harfile/__init__.py index b89b06b..bd40636 100644 --- a/src/harfile/__init__.py +++ b/src/harfile/__init__.py @@ -45,6 +45,8 @@ HAR_VERSION = "1.2" +_JSON_ENCODER = json.JSONEncoder() + class HarFile: _fd: IO[str] @@ -141,23 +143,37 @@ def add_entry( separator = "\n" if self._is_first_entry else ",\n" self._is_first_entry = False write = self._fd.write - dumps = json.dumps + iterencode = _JSON_ENCODER.iterencode if isinstance(startedDateTime, datetime): startedDateTime = startedDateTime.isoformat() write(f"{separator} {{") write(f'\n "startedDateTime": "{startedDateTime}",') write(f'\n "time": {time},') - write(f'\n "request": {dumps(request.asdict())},') - write(f'\n "response": {dumps(response.asdict())},') - write(f'\n "timings": {dumps(timings.asdict())},') + write('\n "request": ') + for chunk in iterencode(request.asdict()): + write(chunk) + write(',\n "response": ') + for chunk in iterencode(response.asdict()): + write(chunk) + write(',\n "timings": ') + for chunk in iterencode(timings.asdict()): + write(chunk) cache = cache or Cache() - write(f'\n "cache": {dumps(cache.asdict())}') + write(',\n "cache": ') + for chunk in iterencode(cache.asdict()): + write(chunk) if serverIPAddress: - write(f',\n "serverIPAddress": {dumps(serverIPAddress)}') + write(',\n "serverIPAddress": ') + for chunk in iterencode(serverIPAddress): + write(chunk) if connection: - write(f',\n "connection": {dumps(connection)}') + write(',\n "connection": ') + for chunk in iterencode(connection): + write(chunk) if comment: - write(f',\n "comment": {dumps(comment)}') + write(',\n "comment": ') + for chunk in iterencode(comment): + write(chunk) write("\n }") def _write_preamble(self) -> None: