:p
atchew
Login
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. The JSONWriter is a short-lived object so the preallocation does not accumulate. Signed-off-by: Bin Guo <guobin@linux.alibaba.com> --- 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 XXXXXXX..XXXXXXX 100644 --- a/qobject/json-writer.c +++ b/qobject/json-writer.c @@ -XXX,XX +XXX,XX @@ 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; } -- 2.50.1 (Apple Git-155)
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. The JSONWriter is a short-lived object so the preallocation does not accumulate. Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Bin Guo <guobin@linux.alibaba.com> --- v1->v2: drop "one page" argument from commit message and comment (per Markus Armbruster's review) 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 XXXXXXX..XXXXXXX 100644 --- a/qobject/json-writer.c +++ b/qobject/json-writer.c @@ -XXX,XX +XXX,XX @@ struct JSONWriter { GByteArray *container_is_array; }; +/* Should cover most QMP responses without reallocation */ +#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; } -- 2.50.1 (Apple Git-155)