In case the prefix string is a single char avoid a costly call to strlen() + strncmp() With this patch git log with --pretty=format option is 10% faster Signed-off-by: Marco Costalba <mcostalba@xxxxxxxxx> --- Some profiling of git-log shows that strbuf_expand() is called for each commit, and every time checks the placeholders vector against the current one. This check is done calling prefixcmp() in a tight loop. Speeding up prefixcmp() speeds up the whole git-log thing. NOTE I: I have tried to perform the single char check directly in the loop, so to avoid to modify prefixcmp() but the results, although better then the vanilla case, are not so good. This means that there are other fast paths that benefit from this optimization of prefixcmp(). NOTE II: currently for _each_ commit is done the whole check of the --pretty=format against the placeholders vector. This is clearly suboptimal because the custom format _never changes_ for the whole git-log run, so some caching of the parsed format would be surely effective. Anyhow, as I said before, this change seems to positively impact other paths apart from the loop in strbuf_expand() so it seems worth to have anyway. git-compat-util.h | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/git-compat-util.h b/git-compat-util.h index 79eb10e..e26b684 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -398,6 +398,10 @@ static inline int sane_case static inline int prefixcmp(const char *str, const char *prefix) { + // shortcut common case of a single char prefix + if (prefix && *(prefix + 1) == '\0' && str) + return *str - *prefix; + return strncmp(str, prefix, strlen(prefix)); } -- 1.5.4.rc2-dirty - 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