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

Re: [PATCH 4/3] midx: inline nth_midxed_pack_entry()

From
Jeff King <peff@peff.net>
Date
Sep 11, 2021, 21:20 UTC
Message-ID
<YT0dgTgLVrtS9md6@coredump.intra.peff.net>
In-Reply-To
<120ffa79-d3cb-2e81-1da6-358e7407ec69@web.de>
On Sat, Sep 11, 2021 at 10:31:34PM +0200, René Scharfe wrote:
Show 22 quoted lines
> Am 11.09.21 um 19:07 schrieb Jeff King:
> > On Sat, Sep 11, 2021 at 06:08:42PM +0200, René Scharfe wrote:
> >
> >> @@ -304,8 +307,7 @@ static int nth_midxed_pack_entry(struct repository *r,
> >>  	if (!is_pack_valid(p))
> >>  		return 0;
> >>
> >> -	nth_midxed_object_oid(&oid, m, pos);
> >> -	if (oidset_contains(&p->bad_objects, &oid))
> >> +	if (oidset_contains(&p->bad_objects, oid))
> >>  		return 0;
> >
> > So we get to avoid the nth_midxed_object_oid() copy entirely. Very nice.
> >
> > Compared to the code before your series, we still have an extra function
> > call to oidset_contains(), which will (in the common case) notice we
> > have no entries and immediately return. But I think that's getting into
> > pointless micro-optimization.
> 
> Right.  I measure a 0.5% slowdown for git multi-pack-index verify.  An
> inline oidset_size call avoids it.  That's easy enough to add, so let's
> have it!
I don't mind that, but I wonder if we can have our cake and eat it, too.

oidset_contains() is short, too, and could be inlined. Or if we're worried about the size of the embedded kh_get_oid_set() getting inlined, we could do something like:

  static inline int oidset_contains(const struct oidset *set, const
				    struct object_id *oid)
  {
	if (!oidset_size(set))
		return 0;
	return oidset_contains_func(set, oid);
  }

That saves callers from having to deal with it, at the expense of a slightly complicated oidset implementation.

I guess it's an extra integer comparison for callers that _do_ expect to have a non-empty set. So maybe it is better left to the caller to decide whether to optimize in this way.

(A totally inline oidset_contains() avoids the extra check, but possibly at the cost of larger code size).

-Peff
Previous: René ScharfeNext: René Scharfe
Message 14 of 28 in “packfile: use oidset for bad objects”
  1. 0/3 packfile: use oidset for bad objectsRené Scharfe, Sep 11, 2021
  2. 1/3 packfile: convert mark_bad_packed_object() to object_idRené Scharfe, Sep 11, 2021
  3. 2/3 packfile: convert has_packed_and_bad() to object_idRené Scharfe, Sep 11, 2021
  4. 3/3 packfile: use oidset for bad objectsRené Scharfe, Sep 11, 2021
  5. Jeff KingSep 11, 2021
  6. René ScharfeSep 11, 2021
  7. Jeff KingSep 11, 2021
  8. René ScharfeSep 11, 2021
  9. Jeff KingSep 11, 2021
  10. 4/3 midx: inline nth_midxed_pack_entry()René Scharfe, Sep 11, 2021
  11. René ScharfeSep 11, 2021
  12. Jeff KingSep 11, 2021
  13. René ScharfeSep 11, 2021
  14. Jeff KingSep 11, 2021
  15. René ScharfeSep 11, 2021
  16. 0/5 packfile: use oidset for bad objectsRené Scharfe, Sep 11, 2021
  17. 1/5 oidset: make oidset_size() an inline functionRené Scharfe, Sep 11, 2021
  18. 2/5 midx: inline nth_midxed_pack_entry()René Scharfe, Sep 11, 2021
  19. 3/5 packfile: convert mark_bad_packed_object() to object_idRené Scharfe, Sep 11, 2021
  20. 4/5 packfile: convert has_packed_and_bad() to object_idRené Scharfe, Sep 11, 2021
  21. 5/5 packfile: use oidset for bad objectsRené Scharfe, Sep 11, 2021
  22. René ScharfeSep 11, 2021
  23. Jeff KingSep 11, 2021
  24. Derrick StoleeSep 11, 2021
  25. Taylor BlauSep 12, 2021
  26. Taylor BlauSep 12, 2021
  27. Derrick StoleeSep 12, 2021
  28. Taylor BlauSep 12, 2021

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.