All of lore.kernel.org
 help / color / mirror / Atom feed
From: "René Scharfe" <l.s.r@web.de>
To: Jeff King <peff@peff.net>
Cc: Git List <git@vger.kernel.org>, Junio C Hamano <gitster@pobox.com>
Subject: Re: [PATCH 4/3] midx: inline nth_midxed_pack_entry()
Date: Sun, 12 Sep 2021 01:39:52 +0200	[thread overview]
Message-ID: <a96f8f25-46c6-5d61-6b3d-4b2da2e44566@web.de> (raw)
In-Reply-To: <YT0dgTgLVrtS9md6@coredump.intra.peff.net>

Am 11.09.21 um 23:20 schrieb Jeff King:
> On Sat, Sep 11, 2021 at 10:31:34PM +0200, René Scharfe wrote:
>
>> 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).

I wondered the same.

Inlining oidset_contains() would follow the spirit of khash.  It adds
16KB to my build (ca. 688 bytes per caller).  Hmm.

I expected the hybrid approach with an inlined emptiness check and a
shared actual contains function to be as fast as the original code, due
to caching.  I actually saw the 0.1% slowdown of git multi-pack-index
verify when I added a fake bad object at the end of prepare_midx_pack()
to simulate a non-empty oidset.  Hmm!

Both are probably defensible, but for this series I took the more
targeted approach to limit the impact.

René

  reply	other threads:[~2021-09-11 23:40 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-11  7:50 [PATCH 0/3] packfile: use oidset for bad objects René Scharfe
2021-09-11  7:59 ` [PATCH 1/3] packfile: convert mark_bad_packed_object() to object_id René Scharfe
2021-09-11  8:00 ` [PATCH 2/3] packfile: convert has_packed_and_bad() " René Scharfe
2021-09-11  8:01 ` [PATCH 3/3] packfile: use oidset for bad objects René Scharfe
2021-09-11 14:26   ` Jeff King
2021-09-11 16:08     ` René Scharfe
2021-09-11 17:03       ` Jeff King
2021-09-11 17:16         ` René Scharfe
2021-09-11 14:27 ` [PATCH 0/3] " Jeff King
2021-09-11 16:08 ` [PATCH 4/3] midx: inline nth_midxed_pack_entry() René Scharfe
2021-09-11 17:03   ` René Scharfe
2021-09-11 17:07   ` Jeff King
2021-09-11 20:31     ` René Scharfe
2021-09-11 21:20       ` Jeff King
2021-09-11 23:39         ` René Scharfe [this message]
2021-09-11 20:31 ` [PATCH v2 0/5] packfile: use oidset for bad objects René Scharfe
2021-09-11 20:36   ` [PATCH 1/5] oidset: make oidset_size() an inline function René Scharfe
2021-09-11 20:39   ` [PATCH 2/5] midx: inline nth_midxed_pack_entry() René Scharfe
2021-09-11 20:40   ` [PATCH 3/5] packfile: convert mark_bad_packed_object() to object_id René Scharfe
2021-09-11 20:42   ` [PATCH v2 4/5] packfile: convert has_packed_and_bad() " René Scharfe
2021-09-11 20:43   ` [PATCH v2 5/5] packfile: use oidset for bad objects René Scharfe
2021-09-11 20:45   ` [PATCH v2 0/5] " René Scharfe
2021-09-11 21:22   ` Jeff King
2021-09-11 23:59   ` Derrick Stolee
2021-09-12  1:51     ` Taylor Blau
2021-09-12  2:29       ` Taylor Blau
2021-09-12  3:51         ` Derrick Stolee
2021-09-12  4:01           ` Taylor Blau

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=a96f8f25-46c6-5d61-6b3d-4b2da2e44566@web.de \
    --to=l.s.r@web.de \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=peff@peff.net \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.