In list_config_help(), a strbuf was being initialized and released inside two separate loops. This caused unnecessary memory allocation and deallocation on every iteration.
Move the strbuf declaration to the top of the function and use strbuf_reset() inside the loops to reuse the same buffer. Similarly release() the buffer at the end of the function to free the memory. This improves performance by avoiding repeated heap pressure by reducing the number of allocations.
This also fixes a minor memory leak when the SHOW_CONFIG_HUMAN case triggers a continue.
Signed-off-by: Siddharth Shrimali <r.siddharth.shrimali@gmail.com> --- builtin/help.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
Show changes to builtin/help.c +3 −4
diff --git a/builtin/help.c b/builtin/help.c index 86a3d03a9b..07398b430e 100644 --- a/builtin/help.c +++ b/builtin/help.c @@ -134,10 +134,10 @@ static void list_config_help(enum show_config_type type) struct string_list keys = STRING_LIST_INIT_DUP; struct string_list keys_uniq = STRING_LIST_INIT_DUP; struct string_list_item *item; + struct strbuf sb = STRBUF_INIT; for (p = config_name_list; *p; p++) { const char *var = *p; - struct strbuf sb = STRBUF_INIT; for (e = slot_expansions; e->prefix; e++) { @@ -149,7 +149,6 @@ static void list_config_help(enum show_config_type type) break; } } - strbuf_release(&sb); if (!e->prefix) string_list_append(&keys, var); } @@ -161,10 +160,10 @@ static void list_config_help(enum show_config_type type) string_list_sort(&keys); for (size_t i = 0; i < keys.nr; i++) { + strbuf_reset(&sb); const char *var = keys.items[i].string; const char *wildcard, *tag, *cut; const char *dot = NULL; - struct strbuf sb = STRBUF_INIT; switch (type) { case SHOW_CONFIG_HUMAN: @@ -195,13 +194,13 @@ static void list_config_help(enum show_config_type type) strbuf_add(&sb, var, cut - var); string_list_append(&keys_uniq, sb.buf); - strbuf_release(&sb); } string_list_clear(&keys, 0); string_list_remove_duplicates(&keys_uniq, 0); for_each_string_list_item(item, &keys_uniq) puts(item->string); + strbuf_release(&sb); string_list_clear(&keys_uniq, 0); }
-- 2.51.2