[PATCH v2 5/8] p5303: measure time to repack with keep
From: Taylor Blau <hidden>
Date: 2021-02-04 04:01:03
Subsystem:
the rest · Maintainer:
Linus Torvalds
From: Jeff King <redacted> 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 <redacted> Signed-off-by: Taylor Blau <redacted> --- 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