On 29/5/26 04:34, Bin Guo wrote:
json_writer_new() creates the output GString with g_string_new(NULL),
which starts at the GLib default of 64 bytes.  Serializing typical
QMP responses then requires multiple reallocations as the buffer
grows -- for query-qmp-schema the GString is reallocated 12+ times.

Preallocate JSON_WRITER_INITIAL_SIZE (4096) bytes.  This covers
most QMP responses without any reallocation.  4096 is one page on
most systems, which is efficient for the allocator.

Why not use qemu_real_host_page_size()?

Anyhow,
Reviewed-by: Philippe Mathieu-Daudé <[email protected]>

 The JSONWriter
is a short-lived object so the preallocation does not accumulate.

Signed-off-by: Bin Guo <[email protected]>
---
  qobject/json-writer.c | 5 ++++-
  1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/qobject/json-writer.c b/qobject/json-writer.c
index aac2c6ab71..fb3f3f3e3c 100644
--- a/qobject/json-writer.c
+++ b/qobject/json-writer.c
@@ -24,13 +24,16 @@ struct JSONWriter {
      GByteArray *container_is_array;
  };
+/* Covers most QMP responses without reallocation (one page) */
+#define JSON_WRITER_INITIAL_SIZE  4096
+
  JSONWriter *json_writer_new(bool pretty)
  {
      JSONWriter *writer = g_new(JSONWriter, 1);
writer->pretty = pretty;
      writer->need_comma = false;
-    writer->contents = g_string_new(NULL);
+    writer->contents = g_string_sized_new(JSON_WRITER_INITIAL_SIZE);
      writer->container_is_array = g_byte_array_new();
      return writer;
  }


Reply via email to