mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	Avoid computing strlen() inside loops
Compiling with -O0 (no proper optimizations), strlen() call in loops for comparing the size, isn't being called/initialized before the actual loop gets started, which causes n-numbers of strlen() calls (as long as the string is). Keeping the length before entering in the loop is a good idea. On some places, even with -O2, both GCC and Clang can't recognize this pattern, which seem to happen in an array of char pointer. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Alexander Motin <mav@FreeBSD.org> Signed-off-by: rilysh <nightquick@proton.me> Closes #16584
This commit is contained in:
		
							parent
							
								
									4adc97ae15
								
							
						
					
					
						commit
						e8f4592a19
					
				| @ -8661,7 +8661,7 @@ zdb_read_block(char *thing, spa_t *spa) | ||||
| 	void *lbuf, *buf; | ||||
| 	char *s, *p, *dup, *flagstr, *sizes, *tmp = NULL; | ||||
| 	const char *vdev, *errmsg = NULL; | ||||
| 	int i, error; | ||||
| 	int i, len, error; | ||||
| 	boolean_t borrowed = B_FALSE, found = B_FALSE; | ||||
| 
 | ||||
| 	dup = strdup(thing); | ||||
| @ -8689,7 +8689,8 @@ zdb_read_block(char *thing, spa_t *spa) | ||||
| 	for (s = strtok_r(flagstr, ":", &tmp); | ||||
| 	    s != NULL; | ||||
| 	    s = strtok_r(NULL, ":", &tmp)) { | ||||
| 		for (i = 0; i < strlen(flagstr); i++) { | ||||
| 		len = strlen(flagstr); | ||||
| 		for (i = 0; i < len; i++) { | ||||
| 			int bit = flagbits[(uchar_t)flagstr[i]]; | ||||
| 
 | ||||
| 			if (bit == 0) { | ||||
| @ -8960,13 +8961,14 @@ zdb_embedded_block(char *thing) | ||||
| static boolean_t | ||||
| zdb_numeric(char *str) | ||||
| { | ||||
| 	int i = 0; | ||||
| 	int i = 0, len; | ||||
| 
 | ||||
| 	if (strlen(str) == 0) | ||||
| 	len = strlen(str); | ||||
| 	if (len == 0) | ||||
| 		return (B_FALSE); | ||||
| 	if (strncmp(str, "0x", 2) == 0 || strncmp(str, "0X", 2) == 0) | ||||
| 		i = 2; | ||||
| 	for (; i < strlen(str); i++) { | ||||
| 	for (; i < len; i++) { | ||||
| 		if (!isxdigit(str[i])) | ||||
| 			return (B_FALSE); | ||||
| 	} | ||||
|  | ||||
| @ -663,15 +663,17 @@ static int | ||||
| str2shift(const char *buf) | ||||
| { | ||||
| 	const char *ends = "BKMGTPEZ"; | ||||
| 	int i; | ||||
| 	int i, len; | ||||
| 
 | ||||
| 	if (buf[0] == '\0') | ||||
| 		return (0); | ||||
| 	for (i = 0; i < strlen(ends); i++) { | ||||
| 
 | ||||
| 	len = strlen(ends); | ||||
| 	for (i = 0; i < len; i++) { | ||||
| 		if (toupper(buf[0]) == ends[i]) | ||||
| 			break; | ||||
| 	} | ||||
| 	if (i == strlen(ends)) { | ||||
| 	if (i == len) { | ||||
| 		(void) fprintf(stderr, "ztest: invalid bytes suffix: %s\n", | ||||
| 		    buf); | ||||
| 		usage(B_FALSE); | ||||
|  | ||||
| @ -1487,15 +1487,17 @@ static int | ||||
| str2shift(libzfs_handle_t *hdl, const char *buf) | ||||
| { | ||||
| 	const char *ends = "BKMGTPEZ"; | ||||
| 	int i; | ||||
| 	int i, len; | ||||
| 
 | ||||
| 	if (buf[0] == '\0') | ||||
| 		return (0); | ||||
| 	for (i = 0; i < strlen(ends); i++) { | ||||
| 
 | ||||
| 	len = strlen(ends); | ||||
| 	for (i = 0; i < len; i++) { | ||||
| 		if (toupper(buf[0]) == ends[i]) | ||||
| 			break; | ||||
| 	} | ||||
| 	if (i == strlen(ends)) { | ||||
| 	if (i == len) { | ||||
| 		if (hdl) | ||||
| 			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, | ||||
| 			    "invalid numeric suffix '%s'"), buf); | ||||
|  | ||||
| @ -790,11 +790,12 @@ zfs_name_to_prop(const char *propname) | ||||
| boolean_t | ||||
| zfs_prop_user(const char *name) | ||||
| { | ||||
| 	int i; | ||||
| 	int i, len; | ||||
| 	char c; | ||||
| 	boolean_t foundsep = B_FALSE; | ||||
| 
 | ||||
| 	for (i = 0; i < strlen(name); i++) { | ||||
| 	len = strlen(name); | ||||
| 	for (i = 0; i < len; i++) { | ||||
| 		c = name[i]; | ||||
| 		if (!zprop_valid_char(c)) | ||||
| 			return (B_FALSE); | ||||
|  | ||||
| @ -473,11 +473,12 @@ vdev_name_to_prop(const char *propname) | ||||
| boolean_t | ||||
| vdev_prop_user(const char *name) | ||||
| { | ||||
| 	int i; | ||||
| 	int i, len; | ||||
| 	char c; | ||||
| 	boolean_t foundsep = B_FALSE; | ||||
| 
 | ||||
| 	for (i = 0; i < strlen(name); i++) { | ||||
| 	len = strlen(name); | ||||
| 	for (i = 0; i < len; i++) { | ||||
| 		c = name[i]; | ||||
| 		if (!zprop_valid_char(c)) | ||||
| 			return (B_FALSE); | ||||
|  | ||||
| @ -56,6 +56,7 @@ main(int argc, const char *const *argv) | ||||
| 		return (1); | ||||
| 	} | ||||
| 	const char *dev_name = argv[1]; | ||||
| 	size_t i, len; | ||||
| 
 | ||||
| 	int fd; | ||||
| 	struct stat sb; | ||||
| @ -73,11 +74,13 @@ main(int argc, const char *const *argv) | ||||
| 	} | ||||
| 
 | ||||
| 	const char *dev_part = strrchr(dev_name, 'p'); | ||||
| 	len = strlen(zvol_name); | ||||
| 	if (dev_part != NULL) { | ||||
| 		sprintf(zvol_name + strlen(zvol_name), "-part%s", dev_part + 1); | ||||
| 		sprintf(zvol_name + len, "-part%s", dev_part + 1); | ||||
| 		len = strlen(zvol_name); | ||||
| 	} | ||||
| 
 | ||||
| 	for (size_t i = 0; i < strlen(zvol_name); ++i) | ||||
| 	for (i = 0; i < len; ++i) | ||||
| 		if (isblank(zvol_name[i])) | ||||
| 			zvol_name[i] = '+'; | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 rilysh
						rilysh