diff options
author | Ron Yorston <rmy@pobox.com> | 2021-01-29 13:23:27 +0000 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2021-02-02 14:37:37 +0100 |
commit | bcf91d276047910538c5de0a45f3a4645e3ff471 (patch) | |
tree | 87feb6eb824d4fc2ee27918a559a03df28e15a99 | |
parent | 59120c330330467c9e6aaec6d4ca8295baa653af (diff) | |
download | busybox-w32-bcf91d276047910538c5de0a45f3a4645e3ff471.tar.gz busybox-w32-bcf91d276047910538c5de0a45f3a4645e3ff471.tar.bz2 busybox-w32-bcf91d276047910538c5de0a45f3a4645e3ff471.zip |
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>
-rw-r--r-- | libbb/compare_string_array.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/libbb/compare_string_array.c b/libbb/compare_string_array.c index a06e57d3d..d8cd033a3 100644 --- a/libbb/compare_string_array.c +++ b/libbb/compare_string_array.c | |||
@@ -63,13 +63,19 @@ int FAST_FUNC index_in_str_array(const char *const string_array[], const char *k | |||
63 | 63 | ||
64 | int FAST_FUNC index_in_strings(const char *strings, const char *key) | 64 | int FAST_FUNC index_in_strings(const char *strings, const char *key) |
65 | { | 65 | { |
66 | int idx = 0; | 66 | int j, idx = 0; |
67 | 67 | ||
68 | while (*strings) { | 68 | while (*strings) { |
69 | if (strcmp(strings, key) == 0) { | 69 | /* Do we see "key\0" at current position in strings? */ |
70 | return idx; | 70 | for (j = 0; *strings == key[j]; ++j) { |
71 | if (*strings++ == '\0') { | ||
72 | //bb_error_msg("found:'%s' i:%u", key, idx); | ||
73 | return idx; /* yes */ | ||
74 | } | ||
71 | } | 75 | } |
72 | strings += strlen(strings) + 1; /* skip NUL */ | 76 | /* No. Move to the start of the next string. */ |
77 | while (*strings++ != '\0') | ||
78 | continue; | ||
73 | idx++; | 79 | idx++; |
74 | } | 80 | } |
75 | return -1; | 81 | return -1; |