summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: c99db9d)
raw | patch | inline | side by side (parent: c99db9d)
author | Brian Downing <bdowning@lavos.net> | |
Thu, 14 Aug 2008 05:36:51 +0000 (00:36 -0500) | ||
committer | Junio C Hamano <gitster@pobox.com> | |
Thu, 14 Aug 2008 06:10:23 +0000 (23:10 -0700) |
Continually xreallocing and freeing the remainder member of struct
xdiff_emit_state was a noticeable performance hit. Use a strbuf
instead.
This yields a decent performance improvement on "git blame" on certain
repositories. For example, before this commit:
$ time git blame -M -C -C -p --incremental server.c >/dev/null
101.52user 0.17system 1:41.73elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+39561minor)pagefaults 0swaps
With this commit:
$ time git blame -M -C -C -p --incremental server.c >/dev/null
80.38user 0.30system 1:20.81elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+50979minor)pagefaults 0swaps
Signed-off-by: Brian Downing <bdowning@lavos.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
xdiff_emit_state was a noticeable performance hit. Use a strbuf
instead.
This yields a decent performance improvement on "git blame" on certain
repositories. For example, before this commit:
$ time git blame -M -C -C -p --incremental server.c >/dev/null
101.52user 0.17system 1:41.73elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+39561minor)pagefaults 0swaps
With this commit:
$ time git blame -M -C -C -p --incremental server.c >/dev/null
80.38user 0.30system 1:20.81elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+50979minor)pagefaults 0swaps
Signed-off-by: Brian Downing <bdowning@lavos.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
xdiff-interface.c | patch | blob | history | |
xdiff-interface.h | patch | blob | history |
diff --git a/xdiff-interface.c b/xdiff-interface.c
index 828b4966a9d1e692ec7a8225406c78fca15bb5d0..bf98866c4f5aa2027135741cb07bc1ec04b11e9f 100644 (file)
--- a/xdiff-interface.c
+++ b/xdiff-interface.c
for (i = 0; i < nbuf; i++) {
if (mb[i].ptr[mb[i].size-1] != '\n') {
/* Incomplete line */
- priv->remainder = xrealloc(priv->remainder,
- priv->remainder_size +
- mb[i].size);
- memcpy(priv->remainder + priv->remainder_size,
- mb[i].ptr, mb[i].size);
- priv->remainder_size += mb[i].size;
+ strbuf_add(&priv->remainder, mb[i].ptr, mb[i].size);
continue;
}
/* we have a complete line */
- if (!priv->remainder) {
+ if (!priv->remainder.len) {
consume_one(priv, mb[i].ptr, mb[i].size);
continue;
}
- priv->remainder = xrealloc(priv->remainder,
- priv->remainder_size +
- mb[i].size);
- memcpy(priv->remainder + priv->remainder_size,
- mb[i].ptr, mb[i].size);
- consume_one(priv, priv->remainder,
- priv->remainder_size + mb[i].size);
- free(priv->remainder);
- priv->remainder = NULL;
- priv->remainder_size = 0;
+ strbuf_add(&priv->remainder, mb[i].ptr, mb[i].size);
+ consume_one(priv, priv->remainder.buf, priv->remainder.len);
+ strbuf_reset(&priv->remainder);
}
- if (priv->remainder) {
- consume_one(priv, priv->remainder, priv->remainder_size);
- free(priv->remainder);
- priv->remainder = NULL;
- priv->remainder_size = 0;
+ if (priv->remainder.len) {
+ consume_one(priv, priv->remainder.buf, priv->remainder.len);
+ strbuf_reset(&priv->remainder);
}
return 0;
}
int ret;
xecb->outf = xdiff_outf;
xecb->priv = state;
+ strbuf_init(&state->remainder, 0);
ret = xdi_diff(mf1, mf2, xpp, xecfg, xecb);
+ strbuf_release(&state->remainder);
return ret;
}
diff --git a/xdiff-interface.h b/xdiff-interface.h
index 6f3b361a845f0f71ece8188e00a3cfa12138edd4..f6a1ec2220512b9aff5c69c4a7f94b0af0dbe3e2 100644 (file)
--- a/xdiff-interface.h
+++ b/xdiff-interface.h
#define XDIFF_INTERFACE_H
#include "xdiff/xdiff.h"
+#include "strbuf.h"
struct xdiff_emit_state;
struct xdiff_emit_state {
xdiff_emit_consume_fn consume;
- char *remainder;
- unsigned long remainder_size;
+ struct strbuf remainder;
};
int xdi_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, xdemitconf_t const *xecfg, xdemitcb_t *ecb);