Git fork

t/perf: implement performance tests for pseudo-merge bitmaps

Implement a straightforward performance test demonstrating the benefit
of pseudo-merge bitmaps by measuring how long it takes to count
reachable objects in a few different scenarios:

- without bitmaps, to demonstrate a reasonable baseline
- with bitmaps, but without pseudo-merges
- with bitmaps and pseudo-merges

Results from running this test on git.git are as follows:

Test this tree
-----------------------------------------------------------------------------------
5333.2: git rev-list --count --all --objects (no bitmaps) 3.54(3.45+0.08)
5333.3: git rev-list --count --all --objects (no pseudo-merges) 0.43(0.40+0.03)
5333.4: git rev-list --count --all --objects (with pseudo-merges) 0.12(0.11+0.01)

On a private repository which is much larger, and has many spikey parts
of history that aren't merged into the 'master' branch, the results are
as follows:

Test this tree
---------------------------------------------------------------------------------------
5333.1: git rev-list --count --all --objects (no bitmaps) 122.29(121.31+0.97)
5333.2: git rev-list --count --all --objects (no pseudo-merges) 21.88(21.30+0.58)
5333.3: git rev-list --count --all --objects (with pseudo-merges) 5.05(4.77+0.28)

Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

authored by

Taylor Blau and committed by
Junio C Hamano
0b7500dc 7252d9a0

+32
+32
t/perf/p5333-pseudo-merge-bitmaps.sh
··· 1 + #!/bin/sh 2 + 3 + test_description='pseudo-merge bitmaps' 4 + . ./perf-lib.sh 5 + 6 + test_perf_large_repo 7 + 8 + test_expect_success 'setup' ' 9 + git \ 10 + -c bitmapPseudoMerge.all.pattern="refs/" \ 11 + -c bitmapPseudoMerge.all.threshold=now \ 12 + -c bitmapPseudoMerge.all.stableThreshold=never \ 13 + -c bitmapPseudoMerge.all.maxMerges=64 \ 14 + -c pack.writeBitmapLookupTable=true \ 15 + repack -adb 16 + ' 17 + 18 + test_perf 'git rev-list --count --all --objects (no bitmaps)' ' 19 + git rev-list --objects --all 20 + ' 21 + 22 + test_perf 'git rev-list --count --all --objects (no pseudo-merges)' ' 23 + GIT_TEST_USE_PSEUDO_MERGES=0 \ 24 + git rev-list --objects --all --use-bitmap-index 25 + ' 26 + 27 + test_perf 'git rev-list --count --all --objects (with pseudo-merges)' ' 28 + GIT_TEST_USE_PSEUDO_MERGES=1 \ 29 + git rev-list --objects --all --use-bitmap-index 30 + ' 31 + 32 + test_done