Use appendStringInfoSpaces in more places
authorDavid Rowley <drowley@postgresql.org>
Fri, 20 Jan 2023 00:07:24 +0000 (13:07 +1300)
committerDavid Rowley <drowley@postgresql.org>
Fri, 20 Jan 2023 00:07:24 +0000 (13:07 +1300)
This adjusts a few places which were appending a string constant
containing spaces onto a StringInfo.  We have appendStringInfoSpaces for
that job, so let's use that instead.

For the change to jsonb.c's add_indent() function, appendStringInfoString
was being called inside a loop to append 4 spaces on each loop.  This
meant that enlargeStringInfo would get called once per loop.  Here it
should be much more efficient to get rid of the loop and just calculate
the number of spaces with "level * 4" and just append all the spaces in
one go.

Here we additionally adjust the appendStringInfoSpaces function so it
makes use of memset rather than a while loop to apply the required spaces
to the StringInfo.  One of the problems with the while loop was that it
was incrementing one variable and decrementing another variable once per
loop.  That's more work than what's required to get the job done.  We may
as well use memset for this rather than trying to optimize the existing
loop.  Some testing has shown memset is faster even for very small sizes.

Discussion: https://postgr.es/m/CAApHDvp_rKkvwudBKgBHniNRg67bzXVjyvVKfX0G2zS967K43A@mail.gmail.com

src/backend/commands/explain.c
src/backend/utils/adt/jsonb.c
src/common/stringinfo.c

index e4621ef8d6ea8af51470d94f57b41988969b324d..5212a64b1e53ea3128c52c0b89c93cd9f5102111 100644 (file)
@@ -3324,7 +3324,7 @@ show_hashagg_info(AggState *aggstate, ExplainState *es)
            if (!gotone)
                ExplainIndentText(es);
            else
-               appendStringInfoString(es->str, "  ");
+               appendStringInfoSpaces(es->str, 2);
 
            appendStringInfo(es->str, "Batches: %d  Memory Usage: " INT64_FORMAT "kB",
                             aggstate->hash_batches_used, memPeakKb);
index 4ff2eced4c0781cd0f9a43c1d7c92ae36e294732..0539f41c172ee4946bc4ee4fdc44c9538b676384 100644 (file)
@@ -626,11 +626,8 @@ add_indent(StringInfo out, bool indent, int level)
 {
    if (indent)
    {
-       int         i;
-
        appendStringInfoCharMacro(out, '\n');
-       for (i = 0; i < level; i++)
-           appendBinaryStringInfo(out, "    ", 4);
+       appendStringInfoSpaces(out, level * 4);
    }
 }
 
index b3d3c99b8c15b8efb8e392ee8c75c0c2fdaf97f3..05b22b5c53c6a4137f022dc74035ed71c8282e68 100644 (file)
@@ -211,8 +211,8 @@ appendStringInfoSpaces(StringInfo str, int count)
        enlargeStringInfo(str, count);
 
        /* OK, append the spaces */
-       while (--count >= 0)
-           str->data[str->len++] = ' ';
+       memset(&str->data[str->len], ' ', count);
+       str->len += count;
        str->data[str->len] = '\0';
    }
 }