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:
		
				
					committed by
					
						 Denys Vlasenko
						Denys Vlasenko
					
				
			
			
				
	
			
			
			
						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 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; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user