Re: [PATCH] Replace strcmp_icase with strequal_icase

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sat, Mar 09, 2013 at 09:42:54AM +0100, Fredrik Gustafsson wrote:
> To improve performance.
> git status before:
> user    0m0.020s
> user    0m0.024s
> user    0m0.024s
> user    0m0.020s
> user    0m0.024s
> user    0m0.028s
> user    0m0.024s
> user    0m0.024s
> user    0m0.016s
> user    0m0.028s
> 
> git status after:
> user    0m0.012s
> user    0m0.008s
> user    0m0.008s
> user    0m0.008s
> user    0m0.008s
> user    0m0.008s
> user    0m0.008s
> user    0m0.004s
> user    0m0.008s
> user    0m0.016s

I tested a slightly different version that checks ignore_case, inlines
if possible and replaces one more strncmp_icase call site (the top
call site in webkit.git). The numbers are impressive (well not as
impressive as yours, but I guess it depends on the actual .gitignore
patterns). On top of my 3/3

        before      after
user    0m0.508s    0m0.392s
user    0m0.511s    0m0.394s
user    0m0.513s    0m0.405s
user    0m0.516s    0m0.407s
user    0m0.516s    0m0.407s
user    0m0.518s    0m0.410s
user    0m0.519s    0m0.412s
user    0m0.524s    0m0.415s
user    0m0.527s    0m0.415s
user    0m0.534s    0m0.417s

I still need to run the test suite. Then maybe reroll my series with
this.

-- 8< --
diff --git a/dir.c b/dir.c
index 2a91d14..6a9b4b7 100644
--- a/dir.c
+++ b/dir.c
@@ -21,6 +21,24 @@ static int read_directory_recursive(struct dir_struct *dir, const char *path, in
 	int check_only, const struct path_simplify *simplify);
 static int get_dtype(struct dirent *de, const char *path, int len);
 
+static inline strnequal_icase(const char *first, const char *second, int length)
+{
+	if (ignore_case) {
+		while (length && toupper(*first) == toupper(*second)) {
+			first++;
+			second++;
+			length--;
+		}
+	} else {
+		while (length && *first == *second) {
+			first++;
+			second++;
+			length--;
+		}
+	}
+	return length == 0;
+}
+
 inline int git_fnmatch(const char *pattern, const char *string,
 		       int flags, int prefix)
 {
@@ -611,11 +629,11 @@ int match_basename(const char *basename, int basenamelen,
 {
 	if (prefix == patternlen) {
 		if (patternlen == basenamelen &&
-		    !strncmp_icase(pattern, basename, patternlen))
+		    strnequal_icase(pattern, basename, patternlen))
 			return 1;
 	} else if (flags & EXC_FLAG_ENDSWITH) {
 		if (patternlen - 1 <= basenamelen &&
-		    !strncmp_icase(pattern + 1,
+		    strnequal_icase(pattern + 1,
 				   basename + basenamelen - patternlen + 1,
 				   patternlen - 1))
 			return 1;
@@ -649,7 +667,7 @@ int match_pathname(const char *pathname, int pathlen,
 	 */
 	if (pathlen < baselen + 1 ||
 	    (baselen && pathname[baselen] != '/') ||
-	    (baselen && strncmp_icase(pathname, base, baselen)))
+	    (baselen && !strnequal_icase(pathname, base, baselen)))
 		return 0;
 
 	namelen = baselen ? pathlen - baselen - 1 : pathlen;
@@ -663,7 +681,7 @@ int match_pathname(const char *pathname, int pathlen,
 		if (prefix > namelen)
 			return 0;
 
-		if (strncmp_icase(pattern, name, prefix))
+		if (!strnequal_icase(pattern, name, prefix))
 			return 0;
 		pattern += prefix;
 		name    += prefix;
-- 8< --
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]