From: scottmk <scottmk@9efc2488-bf62-4759-914b-345cdb29e865>
Date: Mon, 5 Jan 2009 17:50:15 +0000 (+0000)
Subject: This update boosts the performance of the jsonFormatString function.
X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=49c7c159456fd6ed23278ea0fb0461aac4b38941;p=opensrf%2Fbjwebb.git

This update boosts the performance of the jsonFormatString function.

1. Replaced the old _tabs function, which required the construction and
destruction of a growing_buffer, with a new append_indentation function,
which adds white space to an existing growing_buffer.  This change
eliminates a passel of mallocs and frees.

2. Removed the call to strlen() from the loop condition.

3. Replaced calls to buffer_fadd(), a fairly slow function, with calls
to OSRF_BUFFER_ADD_CHAR() and append_indentation().  Also: replaced a
call to buffer_add_char with the corresponding macro.

4. Eliminated a harmless but wasteful bug that sometimes added
indentation to the end of a line.

In my benchmarking, using a moderately complex JSON string 201
characters long, the new version was seven times as fast as the old.


git-svn-id: svn://svn.open-ils.org/OpenSRF/trunk@1571 9efc2488-bf62-4759-914b-345cdb29e865
---

diff --git a/src/libopensrf/osrf_json_tools.c b/src/libopensrf/osrf_json_tools.c
index 0d33acf..91b3f26 100644
--- a/src/libopensrf/osrf_json_tools.c
+++ b/src/libopensrf/osrf_json_tools.c
@@ -21,11 +21,11 @@ static jsonObject* findMultiPath( const jsonObject* o,
 static jsonObject* findMultiPathRecurse( const jsonObject* o, const char* root );
 static jsonObject* _jsonObjectEncodeClass( const jsonObject* obj, int ignoreClass );
 
-static char* _tabs(int count) {
-	growing_buffer* buf = buffer_init(24);
-	int i;
-	for(i=0;i<count;i++) OSRF_BUFFER_ADD(buf, "  ");
-    return buffer_release(buf);
+static void append_indentation( growing_buffer* buf, int depth ) {
+	size_t n = 2 * depth;
+	char indent[ n ];
+	memset( indent, ' ', n );
+	buffer_add_n( buf, indent, n );
 }
 
 char* jsonFormatString( const char* string ) {
@@ -34,38 +34,31 @@ char* jsonFormatString( const char* string ) {
 	growing_buffer* buf = buffer_init(64);
 	int i;
 	int depth = 0;
-	char* tab = NULL;
 
 	char c;
-	for(i=0; i!= strlen(string); i++) {
+	for(i = 0; string[i]; i++) {
 		c = string[i];
 
 		if( c == '{' || c == '[' ) {
 
-			tab = _tabs(++depth);
-			buffer_fadd( buf, "%c\n%s", c, tab);
-			free(tab);
+			OSRF_BUFFER_ADD_CHAR( buf, c );
+			OSRF_BUFFER_ADD_CHAR( buf, '\n' );
+			append_indentation( buf, ++depth );
 
 		} else if( c == '}' || c == ']' ) {
 
-			tab = _tabs(--depth);
-			buffer_fadd( buf, "\n%s%c", tab, c);
-			free(tab);
-
-			if(string[i+1] != ',') {
-				tab = _tabs(depth);
-				buffer_fadd( buf, "%s", tab );	
-				free(tab);
-			}
+			OSRF_BUFFER_ADD_CHAR( buf, '\n' );
+			append_indentation( buf, --depth );
+			OSRF_BUFFER_ADD_CHAR( buf, c );
 
 		} else if( c == ',' ) {
 
-			tab = _tabs(depth);
-			buffer_fadd(buf, ",\n%s", tab);
-			free(tab);
-
-		} else { buffer_add_char(buf, c); }
+			OSRF_BUFFER_ADD_CHAR( buf, ',' );
+			OSRF_BUFFER_ADD_CHAR( buf, '\n' );
+			append_indentation( buf, depth );
 
+		} else
+			OSRF_BUFFER_ADD_CHAR(buf, c);
 	}
 
     return buffer_release(buf);
@@ -297,7 +290,3 @@ static jsonObject* findMultiPathRecurse(const jsonObject* obj, const char* root)
 
 	return arr;
 }
-
-
-
-