Re: [PATCH] Optimize prefixcmp()
- From
René Scharfe <rene.scharfe@lsrfire.ath.cx>
- Date
- Jan 2, 2008, 16:59 UTC
- Message-ID
- <477BC2DA.6000105@lsrfire.ath.cx>
- In-Reply-To
- <Pine.LNX.4.64.0712292019450.14355@wbgn129.biozentrum.uni-wuerzburg.de>
Johannes Schindelin schrieb:
> Certain codepaths (notably "git log --pretty=format...") use > prefixcmp() extensively, with very short prefixes. In those cases, > calling strlen() is a wasteful operation, so avoid it.
Show 11 quoted lines
> static inline int prefixcmp(const char *str, const char *prefix)
> {
> - return strncmp(str, prefix, strlen(prefix));
> + for (; ; str++, prefix++)
> + if (!*prefix)
> + return 0;
> + else if (*str != *prefix)
> + return (unsigned char)*prefix - (unsigned char)*str;
> }
>
> static inline int strtoul_ui(char const *s, int base, unsigned int *result)prefixcmp() was already optimized before -- only for a different use case. At a number of callsites the prefix is a string literal, which allowed the compiler to perform the strlen() call at compile time.
The patch increases the text size considerably: the file "git" is 2,620,938 without and 2,640,450 with the patch in my build (there are 136 callsites in builtin*.c). The new version of prefixcmp() shouldn't be inlined any more, as the benefit of doing so is gone.
Is there a portable way to let the preprocessor decide if prefixcmp_literal() or prefixcmp_generic() is to be used, depending on the prefix being a string literal or not?
René