From 7e74a01fea7b405465a3ae6c688008fd401f11f9 Mon Sep 17 00:00:00 2001 From: Rainer Gerhards Date: Tue, 17 Nov 2015 12:19:32 +0100 Subject: [PATCH] greatly enhance performance of json_object_object_to_json_string() This function and its helpers used to call sprintbuf() for constant strings. This requires a lot of performance, because the call ends up in vprintf(), which is not necessary as there is no modification of the string to be done. In some other places of the code, printbuf_memappend() was used in such cases. This is the right route to follow, because it greatly decreases processing time. This patch does this replacement and keeps using sprintbuf() only where it really is required. In my testing, this resulted in a very noticable performance improvement (n *times* faster, where n depends on the details of what is formatted and with which options). --- json_object.c | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/json_object.c b/json_object.c index 9ac22a3..7f085f3 100644 --- a/json_object.c +++ b/json_object.c @@ -330,42 +330,42 @@ static int json_object_object_to_json_string(struct json_object* jso, int had_children = 0; struct json_object_iter iter; - sprintbuf(pb, "{" /*}*/); + printbuf_memappend(pb, "{" /*}*/, 1); if (flags & JSON_C_TO_STRING_PRETTY) - sprintbuf(pb, "\n"); + printbuf_memappend(pb, "\n", 1); json_object_object_foreachC(jso, iter) { if (had_children) { - sprintbuf(pb, ","); + printbuf_memappend(pb, ",", 1); if (flags & JSON_C_TO_STRING_PRETTY) - sprintbuf(pb, "\n"); + printbuf_memappend(pb, "\n", 1); } had_children = 1; if (flags & JSON_C_TO_STRING_SPACED) - sprintbuf(pb, " "); + printbuf_memappend(pb, " ", 1); indent(pb, level+1, flags); - sprintbuf(pb, "\""); + printbuf_memappend(pb, "\"", 1); json_escape_str(pb, iter.key, strlen(iter.key)); if (flags & JSON_C_TO_STRING_SPACED) - sprintbuf(pb, "\": "); + printbuf_memappend(pb, "\": ", 3); else - sprintbuf(pb, "\":"); + printbuf_memappend(pb, "\":", 2); if(iter.val == NULL) - sprintbuf(pb, "null"); + printbuf_memappend(pb, "null", 4); else iter.val->_to_json_string(iter.val, pb, level+1,flags); } if (flags & JSON_C_TO_STRING_PRETTY) { if (had_children) - sprintbuf(pb, "\n"); + printbuf_memappend(pb, "\n",1); indent(pb,level,flags); } if (flags & JSON_C_TO_STRING_SPACED) - return sprintbuf(pb, /*{*/ " }"); + return printbuf_memappend(pb, /*{*/ " }", 2); else - return sprintbuf(pb, /*{*/ "}"); + return printbuf_memappend(pb, /*{*/ "}", 1); } @@ -504,9 +504,9 @@ static int json_object_boolean_to_json_string(struct json_object* jso, int flags) { if (jso->o.c_boolean) - return sprintbuf(pb, "true"); + return printbuf_memappend(pb, "true", 4); else - return sprintbuf(pb, "false"); + return printbuf_memappend(pb, "false", 5); } struct json_object* json_object_new_boolean(json_bool b) @@ -772,9 +772,9 @@ static int json_object_string_to_json_string(struct json_object* jso, int level, int flags) { - sprintbuf(pb, "\""); + printbuf_memappend(pb, "\"", 1); json_escape_str(pb, get_string_component(jso), jso->o.c_string.len); - sprintbuf(pb, "\""); + printbuf_memappend(pb, "\"", 1); return 0; } @@ -869,39 +869,39 @@ static int json_object_array_to_json_string(struct json_object* jso, { int had_children = 0; int ii; - sprintbuf(pb, "["); + printbuf_memappend(pb, "[", 1); if (flags & JSON_C_TO_STRING_PRETTY) - sprintbuf(pb, "\n"); + printbuf_memappend(pb, "\n", 1); for(ii=0; ii < json_object_array_length(jso); ii++) { struct json_object *val; if (had_children) { - sprintbuf(pb, ","); + printbuf_memappend(pb, ",", 1); if (flags & JSON_C_TO_STRING_PRETTY) - sprintbuf(pb, "\n"); + printbuf_memappend(pb, "\n", 1); } had_children = 1; if (flags & JSON_C_TO_STRING_SPACED) - sprintbuf(pb, " "); + printbuf_memappend(pb, " ", 1); indent(pb, level + 1, flags); val = json_object_array_get_idx(jso, ii); if(val == NULL) - sprintbuf(pb, "null"); + printbuf_memappend(pb, "null", 4); else val->_to_json_string(val, pb, level+1, flags); } if (flags & JSON_C_TO_STRING_PRETTY) { if (had_children) - sprintbuf(pb, "\n"); + printbuf_memappend(pb, "\n", 1); indent(pb,level,flags); } if (flags & JSON_C_TO_STRING_SPACED) - return sprintbuf(pb, " ]"); + return printbuf_memappend(pb, " ]", 2); else - return sprintbuf(pb, "]"); + return printbuf_memappend(pb, "]", 1); } static void json_object_array_entry_free(void *data)