[pacman-dev] [PATCH] Streamline alpm_splitdep() comparisons

Dan McGee dan at archlinux.org
Mon Aug 29 11:24:21 EDT 2011


This reduces from 5 to 3 the number of searches needed on the string
looking for a comparison operator, since we can so a second quick
comparison looking for '=' if we find '<' or '>'. It also makes every
search doable with strchr() or memchr() rather than the slower strstr()
method.

In testing, only 10% of splitdep calls (~1600 / 16000) during an -Ss
database load found a version comparison operator, so optimizing the not
found path to be require less work makes sense.

Signed-off-by: Dan McGee <dan at archlinux.org>
---
 lib/libalpm/deps.c |   32 +++++++++++++++++++-------------
 1 files changed, 19 insertions(+), 13 deletions(-)

diff --git a/lib/libalpm/deps.c b/lib/libalpm/deps.c
index e268157..639f14b 100644
--- a/lib/libalpm/deps.c
+++ b/lib/libalpm/deps.c
@@ -410,31 +410,37 @@ alpm_depend_t *_alpm_splitdep(const char *depstring)
 {
 	alpm_depend_t *depend;
 	const char *ptr, *version = NULL;
+	size_t deplen;
 
 	if(depstring == NULL) {
 		return NULL;
 	}
 
 	CALLOC(depend, 1, sizeof(alpm_depend_t), return NULL);
+	deplen = strlen(depstring);
 
 	/* Find a version comparator if one exists. If it does, set the type and
 	 * increment the ptr accordingly so we can copy the right strings. */
-	if((ptr = strstr(depstring, ">="))) {
-		depend->mod = ALPM_DEP_MOD_GE;
-		version = ptr + 2;
-	} else if((ptr = strstr(depstring, "<="))) {
-		depend->mod = ALPM_DEP_MOD_LE;
-		version = ptr + 2;
-	} else if((ptr = strstr(depstring, "="))) {
+	if((ptr = memchr(depstring, '<', deplen))) {
+		if(ptr[1] == '=') {
+			depend->mod = ALPM_DEP_MOD_LE;
+			version = ptr + 2;
+		} else {
+			depend->mod = ALPM_DEP_MOD_LT;
+			version = ptr + 1;
+		}
+	} else if((ptr = memchr(depstring, '>', deplen))) {
+		if(ptr[1] == '=') {
+			depend->mod = ALPM_DEP_MOD_GE;
+			version = ptr + 2;
+		} else {
+			depend->mod = ALPM_DEP_MOD_GT;
+			version = ptr + 1;
+		}
+	} else if((ptr = memchr(depstring, '=', deplen))) {
 		/* Note: we must do =,<,> checks after <=, >= checks */
 		depend->mod = ALPM_DEP_MOD_EQ;
 		version = ptr + 1;
-	} else if((ptr = strstr(depstring, "<"))) {
-		depend->mod = ALPM_DEP_MOD_LT;
-		version = ptr + 1;
-	} else if((ptr = strstr(depstring, ">"))) {
-		depend->mod = ALPM_DEP_MOD_GT;
-		version = ptr + 1;
 	} else {
 		/* no version specified, leave version and ptr NULL */
 		depend->mod = ALPM_DEP_MOD_ANY;
-- 
1.7.6.1



More information about the pacman-dev mailing list