diff options
author | Thomas Haller <thaller@redhat.com> | 2020-08-25 11:51:46 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2020-08-25 12:45:26 +0200 |
commit | 9b54d175bf2ea4bacea7c7c4f0970c4b877d279d (patch) | |
tree | 9948f44dbb45181ab79fa3bd1fbe1ae135be6c1e /shared | |
parent | 2e0cd52474da9998b187b8aa3ba65f3686ad4d7e (diff) | |
download | NetworkManager-9b54d175bf2ea4bacea7c7c4f0970c4b877d279d.tar.gz |
shared: avoid multiple strlen() calls in _nm_utils_strv_dup_packed()
Instead of calling strlen() for all strings twice, remember the length
in a temporary buffer.
Yes, this is measurably faster.
Diffstat (limited to 'shared')
-rw-r--r-- | shared/nm-glib-aux/nm-shared-utils.c | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/shared/nm-glib-aux/nm-shared-utils.c b/shared/nm-glib-aux/nm-shared-utils.c index be7b1cd9c7..03f31967c9 100644 --- a/shared/nm-glib-aux/nm-shared-utils.c +++ b/shared/nm-glib-aux/nm-shared-utils.c @@ -3427,6 +3427,8 @@ _nm_utils_strv_dup_packed (const char *const*strv, gssize len) { + gs_free gsize *str_len_free = NULL; + gsize *str_len; const char **result; gsize mem_len; gsize pre_len; @@ -3436,7 +3438,6 @@ _nm_utils_strv_dup_packed (const char *const*strv, nm_assert (len >= -1); - mem_len = 0; if (G_LIKELY (len < 0)) { if ( !strv || !strv[0]) { @@ -3444,19 +3445,30 @@ _nm_utils_strv_dup_packed (const char *const*strv, * yourself. */ return NULL; } - for (i = 0; strv[i]; i++) - mem_len += strlen (strv[i]); - len2 = i; + len2 = NM_PTRARRAY_LEN (strv); } else { if (len == 0) return NULL; len2 = len; - for (i = 0; i < len; i++) { - if (G_LIKELY (strv[i])) - mem_len += strlen (strv[i]); - } } - mem_len += len2; + + if (len2 > 300u / sizeof (gsize)) { + str_len_free = g_new (gsize, len2); + str_len = str_len_free; + } else + str_len = g_newa (gsize, len2); + + mem_len = 0; + for (i = 0; i < len2; i++) { + gsize l; + + if (G_LIKELY (strv[i])) + l = strlen (strv[i]) + 1u; + else + l = 0; + str_len[i] = l; + mem_len += l; + } pre_len = sizeof (const char *) * (len2 + 1u); @@ -3479,7 +3491,7 @@ _nm_utils_strv_dup_packed (const char *const*strv, result[i] = sbuf; - l = strlen (strv[i]) + 1u; + l = str_len[i]; memcpy (sbuf, strv[i], l); sbuf += l; } |