git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] Replace strcmp_icase with strequal_icase

From
Duy Nguyen <pclouds@gmail.com>
Date
Mar 9, 2013, 10:21 UTC
Message-ID
<20130309102155.GA11616@lanh>
In-Reply-To
<1362818574-16873-1-git-send-email-iveqy@iveqy.com>
On Sat, Mar 09, 2013 at 09:42:54AM +0100, Fredrik Gustafsson wrote:
Show 24 quoted lines
> 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< --
Previous: Fredrik GustafssonNext: Duy Nguyen
Message 3 of 9 in “Replace strcmp_icase with strequal_icase”
  1. Replace strcmp_icase with strequal_icaseFredrik Gustafsson, Mar 9, 2013
  2. Fredrik GustafssonMar 9, 2013
  3. Duy NguyenMar 9, 2013
  4. Duy NguyenMar 9, 2013
  5. Duy NguyenMar 9, 2013
  6. Fredrik GustafssonMar 9, 2013
  7. Duy NguyenMar 9, 2013
  8. Fredrik GustafssonMar 9, 2013
  9. Duy NguyenMar 9, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.