Skip to content

Commit

Permalink
p1500: add is-base performance tests
Browse files Browse the repository at this point in the history
The previous two changes introduced a commit walking heuristic for
finding the most likely base branch for a given source. This
algorithm walks first-parent histories until reaching a collision.

This walk _should_ be very fast. Exceptions include cases where a
commit-graph file does not exist, leading to a full walk of all
reachable commits to compute generation numbers, or a case where
no collision in the first-parent history exists, leading to a walk
of all first-parent history to the root commits.

The p1500 test script guarantees a complete commit-graph file during
its setup, so we will not test that scenario. Do create a new root
commit in an effort to test the scenario of parallel first-parent
histories.

Even with the extra root commit, these tests take no longer than
0.02 seconds on my machine for the Git repository. However, the
results are slightly more interesting in a copy of the Linux kernel
repository:

Test
---------------------------------------------------------------
1500.2: ahead-behind counts: git for-each-ref              0.12
1500.3: ahead-behind counts: git branch                    0.12
1500.4: ahead-behind counts: git tag                       0.12
1500.5: contains: git for-each-ref --merged                0.04
1500.6: contains: git branch --merged                      0.04
1500.7: contains: git tag --merged                         0.04
1500.8: is-base check: test-tool reach (refs)              0.03
1500.9: is-base check: test-tool reach (tags)              0.03
1500.10: is-base check: git for-each-ref                   0.03
1500.11: is-base check: git for-each-ref (disjoint-base)   0.07

Signed-off-by: Derrick Stolee <[email protected]>
  • Loading branch information
derrickstolee committed Aug 1, 2024
1 parent 6b1e6c4 commit febf73f
Showing 1 changed file with 31 additions and 0 deletions.
31 changes: 31 additions & 0 deletions t/perf/p1500-graph-walks.sh
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,21 @@ test_expect_success 'setup' '
echo tag-$ref ||
return 1
done >tags &&
echo "A:HEAD" >test-tool-refs &&
for line in $(cat refs)
do
echo "X:$line" >>test-tool-refs || return 1
done &&
echo "A:HEAD" >test-tool-tags &&
for line in $(cat tags)
do
echo "X:$line" >>test-tool-tags || return 1
done &&
commit=$(git commit-tree $(git rev-parse HEAD^{tree})) &&
git update-ref refs/heads/disjoint-base $commit &&
git commit-graph write --reachable
'

Expand Down Expand Up @@ -47,4 +62,20 @@ test_perf 'contains: git tag --merged' '
xargs git tag --merged=HEAD <tags
'

test_perf 'is-base check: test-tool reach (refs)' '
test-tool reach get_branch_base_for_tip <test-tool-refs
'

test_perf 'is-base check: test-tool reach (tags)' '
test-tool reach get_branch_base_for_tip <test-tool-tags
'

test_perf 'is-base check: git for-each-ref' '
git for-each-ref --format="%(is-base:HEAD)" --stdin <refs
'

test_perf 'is-base check: git for-each-ref (disjoint-base)' '
git for-each-ref --format="%(is-base:refs/heads/disjoint-base)" --stdin <refs
'

test_done

0 comments on commit febf73f

Please sign in to comment.