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:
parent
59120c3303
commit
bcf91d2760
@ -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 FAST_FUNC index_in_strings(const char *strings, const char *key)
|
||||||
{
|
{
|
||||||
int idx = 0;
|
int j, idx = 0;
|
||||||
|
|
||||||
while (*strings) {
|
while (*strings) {
|
||||||
if (strcmp(strings, key) == 0) {
|
/* Do we see "key\0" at current position in strings? */
|
||||||
return idx;
|
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++;
|
idx++;
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
|
Loading…
Reference in New Issue
Block a user