From: "Marco Costalba" <mcostalba@gmail.com>
To: "Git Mailing List" <git@vger.kernel.org>
Subject: [PATCH] Speedup prefixcmp() common case
Date: Sat, 29 Dec 2007 19:01:08 +0100 [thread overview]
Message-ID: <e5bfff550712291001q5f246ceah6700b98308fb96f1@mail.gmail.com> (raw)
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@gmail.com>
---
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
next reply other threads:[~2007-12-29 18:01 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-12-29 18:01 Marco Costalba [this message]
2007-12-29 19:22 ` [PATCH] Optimize prefixcmp() Johannes Schindelin
2007-12-29 20:39 ` Marco Costalba
2007-12-29 22:15 ` Johannes Schindelin
2007-12-29 22:44 ` Marco Costalba
2007-12-30 13:02 ` Marco Costalba
2007-12-30 13:55 ` Pierre Habouzit
2007-12-30 13:58 ` Pierre Habouzit
2007-12-30 14:50 ` Marco Costalba
2007-12-30 15:17 ` Marco Costalba
2007-12-30 15:54 ` Johannes Schindelin
2007-12-29 21:54 ` Andy Parkins
2007-12-30 0:44 ` Junio C Hamano
2008-01-02 16:59 ` René Scharfe
2008-01-02 18:52 ` Junio C Hamano
2008-01-03 0:45 ` René Scharfe
2007-12-29 19:32 ` [PATCH] Speedup prefixcmp() common case Junio C Hamano
2007-12-29 20:14 ` Marco Costalba
2007-12-30 0:05 ` Junio C Hamano
2007-12-29 20:43 ` Marco Costalba
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=e5bfff550712291001q5f246ceah6700b98308fb96f1@mail.gmail.com \
--to=mcostalba@gmail.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).