Re: [PATCH] use strbuf_addbuf() for appending a strbuf to another
- From
René Scharfe <l.s.r@web.de>
- Date
- Jul 21, 2016, 16:46 UTC
- Message-ID
- <5790FC74.6000602@web.de>
- In-Reply-To
- <20160720132025.GD17469@sigill.intra.peff.net>
Am 20.07.2016 um 15:20 schrieb Jeff King:
Show 22 quoted lines
> On Tue, Jul 19, 2016 at 08:36:29PM +0200, René Scharfe wrote: > >> Use strbuf_addbuf() where possible; it's shorter and more efficient. > > After seeing "efficient", I was momentarily surprised by the first hunk: > >> diff --git a/dir.c b/dir.c >> index 6172b34..0ea235f 100644 >> --- a/dir.c >> +++ b/dir.c >> @@ -2364,7 +2364,7 @@ void write_untracked_extension(struct strbuf *out, struct untracked_cache *untra >> >> varint_len = encode_varint(untracked->ident.len, varbuf); >> strbuf_add(out, varbuf, varint_len); >> - strbuf_add(out, untracked->ident.buf, untracked->ident.len); >> + strbuf_addbuf(out, &untracked->ident); > > This is actually slightly _less_ efficient, because we already are using > the precomputed len, and the new code will call an extra strbuf_grow() > to cover the case where the two arguments are the same. See 81d2cae > (strbuf_addbuf(): allow passing the same buf to dst and src, > 2010-01-12).
Ah, I wasn't aware of that. Calling strbuf_grow() twice shouldn't be thaaat bad. However, I wonder where we duplicate strbufs, or why we would ever want to do so. Anyway, here's a patch for that:
-- >8 -- Subject: strbuf: avoid calling strbuf_grow() twice in strbuf_addbuf()
Implement strbuf_addbuf() as a normal function in order to avoid calling strbuf_grow() twice, with the second callinside strbud_add() being a no-op. This is slightly faster and also reduces the text size a bit.
Signed-off-by: Rene Scharfe <l.s.r@web.de> --- strbuf.c | 7 +++++++ strbuf.h | 6 +----- 2 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/strbuf.c b/strbuf.c index 1ba600b..f3bd571 100644 --- a/strbuf.c +++ b/strbuf.c @@ -197,6 +197,13 @@ void strbuf_add(struct strbuf *sb, const void *data, size_t len) strbuf_setlen(sb, sb->len + len); } +void strbuf_addbuf(struct strbuf *sb, const struct strbuf *sb2) +{ + strbuf_grow(sb, sb2->len); + memcpy(sb->buf + sb->len, sb2->buf, sb2->len); + strbuf_setlen(sb, sb->len + sb2->len); +} + void strbuf_adddup(struct strbuf *sb, size_t pos, size_t len) { strbuf_grow(sb, len); diff --git a/strbuf.h b/strbuf.h index 83c5c98..ba8d5f1 100644 --- a/strbuf.h +++ b/strbuf.h @@ -263,11 +263,7 @@ static inline void strbuf_addstr(struct strbuf *sb, const char *s) /** * Copy the contents of another buffer at the end of the current one. */ -static inline void strbuf_addbuf(struct strbuf *sb, const struct strbuf *sb2) -{ - strbuf_grow(sb, sb2->len); - strbuf_add(sb, sb2->buf, sb2->len); -} +extern void strbuf_addbuf(struct strbuf *sb, const struct strbuf *sb2); /** * Copy part of the buffer from a given position till a given length to the
-- 2.9.2