Here are a couple more easy micro-optimizations in nearby code. I've split them into individual patches for review, but I'll probably just combine them into one patch before committing.
-- Nathan Bossart Amazon Web Services: https://aws.amazon.com
>From 79727aab47c7d7cd733ce21c8241051de6c9ae1e Mon Sep 17 00:00:00 2001 From: Nathan Bossart <nat...@postgresql.org> Date: Fri, 8 Dec 2023 14:03:00 -0600 Subject: [PATCH v1 1/3] micro-optimize bool code path in datum_to_json_internal() shows about an 18% speed up on my machine --- src/backend/utils/adt/json.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/backend/utils/adt/json.c b/src/backend/utils/adt/json.c index e585981d08..4ac5837a23 100644 --- a/src/backend/utils/adt/json.c +++ b/src/backend/utils/adt/json.c @@ -208,11 +208,14 @@ datum_to_json_internal(Datum val, bool is_null, StringInfo result, composite_to_json(val, result, false); break; case JSONTYPE_BOOL: - outputstr = DatumGetBool(val) ? "true" : "false"; if (key_scalar) - escape_json(result, outputstr); + appendStringInfoChar(result, '"'); + if (DatumGetBool(val)) + appendBinaryStringInfo(result, "true", strlen("true")); else - appendStringInfoString(result, outputstr); + appendBinaryStringInfo(result, "false", strlen("false")); + if (key_scalar) + appendStringInfoChar(result, '"'); break; case JSONTYPE_NUMERIC: outputstr = OidOutputFunctionCall(outfuncoid, val); -- 2.25.1
>From bcba82c9ba451c011ac66a70d6cad5be3ccf2d67 Mon Sep 17 00:00:00 2001 From: Nathan Bossart <nat...@postgresql.org> Date: Fri, 8 Dec 2023 14:10:00 -0600 Subject: [PATCH v1 2/3] micro-optimize null code path in datum_to_json_internal() shows about a 29% speed up on my machine --- src/backend/utils/adt/json.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/utils/adt/json.c b/src/backend/utils/adt/json.c index 4ac5837a23..24e12244cc 100644 --- a/src/backend/utils/adt/json.c +++ b/src/backend/utils/adt/json.c @@ -186,7 +186,7 @@ datum_to_json_internal(Datum val, bool is_null, StringInfo result, if (is_null) { - appendStringInfoString(result, "null"); + appendBinaryStringInfo(result, "null", strlen("null")); return; } -- 2.25.1
>From 35324988e9c42c275806763bd0bf6b570616a8e7 Mon Sep 17 00:00:00 2001 From: Nathan Bossart <nat...@postgresql.org> Date: Fri, 8 Dec 2023 14:15:56 -0600 Subject: [PATCH v1 3/3] micro-optimize cast code path in datum_to_json_internal() --- src/backend/utils/adt/json.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/backend/utils/adt/json.c b/src/backend/utils/adt/json.c index 24e12244cc..aa20cf60ea 100644 --- a/src/backend/utils/adt/json.c +++ b/src/backend/utils/adt/json.c @@ -278,9 +278,8 @@ datum_to_json_internal(Datum val, bool is_null, StringInfo result, case JSONTYPE_CAST: /* outfuncoid refers to a cast function, not an output function */ jsontext = DatumGetTextPP(OidFunctionCall1(outfuncoid, val)); - outputstr = text_to_cstring(jsontext); - appendStringInfoString(result, outputstr); - pfree(outputstr); + appendBinaryStringInfo(result, VARDATA_ANY(jsontext), + VARSIZE_ANY_EXHDR(jsontext)); pfree(jsontext); break; default: -- 2.25.1