From: Jeff King <peff@xxxxxxxx> This is the same as the regular repack test, except that we mark the single base pack as "kept" and use --assume-kept-packs-closed. The theory is that this should be faster than the normal repack, because we'll have fewer objects to traverse and process. Here are some timings on a recent clone of the kernel. In the single-pack case, there is nothing do since there are no non-excluded packs: 5303.5: repack (1) 57.42(54.88+10.64) 5303.6: repack with --stdin-packs (1) 0.01(0.01+0.00) and in the 50-pack case, it is much faster to use `--stdin-packs`, since we avoid having to consider any objects in the excluded pack: 5303.10: repack (50) 71.26(88.24+4.96) 5303.11: repack with --stdin-packs (50) 3.49(11.82+0.28) but our improvements vanish as we approach 1000 packs. 5303.15: repack (1000) 215.64(491.33+14.80) 5303.16: repack with --stdin-packs (1000) 198.79(380.51+7.97) That's because the code paths around handling .keep files are known to scale badly; they look in every single pack file to find each object. Our solution to that was to notice that most repos don't have keep files, and to make that case a fast path. But as soon as you add a single .keep, that part of pack-objects slows down again (even if we have fewer objects total to look at). Signed-off-by: Jeff King <peff@xxxxxxxx> Signed-off-by: Taylor Blau <me@xxxxxxxxxxxx> --- t/perf/p5303-many-packs.sh | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/t/perf/p5303-many-packs.sh b/t/perf/p5303-many-packs.sh index d90d714923..b76a6efe00 100755 --- a/t/perf/p5303-many-packs.sh +++ b/t/perf/p5303-many-packs.sh @@ -31,8 +31,11 @@ repack_into_n () { ' "$1" >pushes && # create base packfile - head -n 1 pushes | - git pack-objects --delta-base-offset --revs staging/pack && + base_pack=$( + head -n 1 pushes | + git pack-objects --delta-base-offset --revs staging/pack + ) && + test_export base_pack && # and then incrementals between each pair of commits last= && @@ -49,6 +52,12 @@ repack_into_n () { last=$rev done <pushes && + ( + find staging -type f -name 'pack-*.pack' | + xargs -n 1 basename | grep -v "$base_pack" && + printf "^pack-%s.pack\n" $base_pack + ) >stdin.packs + # and install the whole thing rm -f .git/objects/pack/* && mv staging/* .git/objects/pack/ @@ -91,6 +100,15 @@ do --reflog --indexed-objects --delta-base-offset \ --stdout </dev/null >/dev/null ' + + test_perf "repack with --stdin-packs ($nr_packs)" ' + git pack-objects \ + --keep-true-parents \ + --stdin-packs \ + --non-empty \ + --delta-base-offset \ + --stdout <stdin.packs >/dev/null + ' done # Measure pack loading with 10,000 packs. -- 2.30.0.533.g2f8b6b552f.dirty