Re: [PATCH v2 13/24] pack-bitmap: read multi-pack bitmaps
From: Taylor Blau <hidden>
Date: 2021-07-26 20:36:04
On Fri, Jul 23, 2021 at 06:00:47AM -0400, Jeff King wrote:
On Wed, Jul 21, 2021 at 07:01:16PM -0400, Taylor Blau wrote:quoted
quoted
quoted
+ if (bitmap_is_midx(bitmap_git)) { + /* + * Can't reuse from a non-preferred pack (see + * above). + */ + if (pos + offset >= objects_nr) + continue; + } + try_partial_reuse(bitmap_git, pack, pos + offset, reuse, &w_curs);...and this likewise makes sure we never go past that first pack. Good. I think this "continue" could actually be a "break", as the loop is iterating over "offset" (and "pos + offset" always gets larger). In fact, it could break out of the outer loop as well (which is incrementing "pos"). It's probably a pretty small efficiency in practice, though.Yeah; you're right. And we'll save up to BITS_IN_EWORD cycles of this loop. (I wonder if smart-enough compilers will realize the same optimization that you did and turn that `continue` into a `break` automatically, but that's neither here nor there).If you break all the way out, then it saves iterating over all of those other words that are not in the first pack, too. I.e., if your bitmap has 10 million bits (for a 10-million object clone), but your first pack only has a million objects in it, we'll call try_partial_reuse() 9 million extra times. Fortunately, each call is super cheap, because the first thing it does is check if the requested bit is past the end of the pack. Which kind of makes me wonder if we could simplify this further by just letting try_partial_reuse() tell us when there's no point going further: [snip suggested diff]
All looks pretty good to me. I think that a goto is a little easier to read than two identical "if (ret < 0)" checks. And having a comment makes it clearer to me than the double if statements. So I'm content do to that instead. Thanks, Taylor