libbb: code shrink and speed up index_in_strings()

Rewrite index_in_strings() to replace calls to strcmp()/strlen().
With this change searching for valid names in the applet_names
array (for example) is 40% faster.

The code has to assume the strings aren't sorted, so will always scan
the entire array when presented with an invalid name.

function                                             old     new   delta
index_in_strings                                      63      56      -7
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-7)               Total: -7 bytes

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Ron Yorston 2021-01-29 13:23:27 +00:00 committed by Denys Vlasenko
parent 59120c3303
commit bcf91d2760

View File

@ -63,13 +63,19 @@ int FAST_FUNC index_in_str_array(const char *const string_array[], const char *k
int FAST_FUNC index_in_strings(const char *strings, const char *key)
{
int idx = 0;
int j, idx = 0;
while (*strings) {
if (strcmp(strings, key) == 0) {
return idx;
/* Do we see "key\0" at current position in strings? */
for (j = 0; *strings == key[j]; ++j) {
if (*strings++ == '\0') {
//bb_error_msg("found:'%s' i:%u", key, idx);
return idx; /* yes */
}
strings += strlen(strings) + 1; /* skip NUL */
}
/* No. Move to the start of the next string. */
while (*strings++ != '\0')
continue;
idx++;
}
return -1;