git/list[1] front-page[2] threads[3] people[4] search[5] about
 

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
Previous: Jeff KingNext: Jeff King
Message 3 of 5 in “use strbuf_addbuf() for appending a strbuf to another”
  1. use strbuf_addbuf() for appending a strbuf to anotherRené Scharfe, Jul 19, 2016
  2. Jeff KingJul 20, 2016
  3. René ScharfeJul 21, 2016
  4. Jeff KingJul 21, 2016
  5. Junio C HamanoJul 22, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.