Merge branch 'ab/perf-wildmatch'

Add perf-test for wildmatch.

* ab/perf-wildmatch:
  perf: add test showing exponential growth in path globbing
  perf: add function to setup a fresh test repo
This commit is contained in:
Junio C Hamano 2017-05-30 11:16:40 +09:00
commit 140921ca21
3 changed files with 59 additions and 4 deletions

View File

@ -106,6 +106,7 @@ sources perf-lib.sh:
After that you will want to use some of the following:
test_perf_fresh_repo # sets up an empty repository
test_perf_default_repo # sets up a "normal" repository
test_perf_large_repo # sets up a "large" repository

43
t/perf/p0100-globbing.sh Executable file
View File

@ -0,0 +1,43 @@
#!/bin/sh
test_description="Tests pathological globbing performance
Shows how Git's globbing performance performs when given the sort of
pathological patterns described in at https://research.swtch.com/glob
"
. ./perf-lib.sh
test_globs_big='10 25 50 75 100'
test_globs_small='1 2 3 4 5 6'
test_perf_fresh_repo
test_expect_success 'setup' '
for i in $(test_seq 1 100)
do
printf "a" >>refname &&
for j in $(test_seq 1 $i)
do
printf "a*" >>refglob.$i
done &&
echo b >>refglob.$i
done &&
test_commit test $(cat refname).t "" $(cat refname).t
'
for i in $test_globs_small
do
test_perf "refglob((a*)^nb) against tag (a^100).t; n = $i" '
git for-each-ref "refs/tags/$(cat refglob.'$i')b"
'
done
for i in $test_globs_small
do
test_perf "fileglob((a*)^nb) against file (a^100).t; n = $i" '
git ls-files "$(cat refglob.'$i')b"
'
done
test_done

View File

@ -78,6 +78,10 @@ if test -z "$GIT_PERF_LARGE_REPO"; then
GIT_PERF_LARGE_REPO=$TEST_DIRECTORY/..
fi
test_perf_do_repo_symlink_config_ () {
test_have_prereq SYMLINKS || git config core.symlinks false
}
test_perf_create_repo_from () {
test "$#" = 2 ||
error "bug in the test script: not 2 parameters to test-create-repo"
@ -102,15 +106,22 @@ test_perf_create_repo_from () {
) &&
(
cd "$repo" &&
"$MODERN_GIT" init -q && {
test_have_prereq SYMLINKS ||
git config core.symlinks false
} &&
"$MODERN_GIT" init -q &&
test_perf_do_repo_symlink_config_ &&
mv .git/hooks .git/hooks-disabled 2>/dev/null
) || error "failed to copy repository '$source' to '$repo'"
}
# call at least one of these to establish an appropriately-sized repository
test_perf_fresh_repo () {
repo="${1:-$TRASH_DIRECTORY}"
"$MODERN_GIT" init -q "$repo" &&
(
cd "$repo" &&
test_perf_do_repo_symlink_config_
)
}
test_perf_default_repo () {
test_perf_create_repo_from "${1:-$TRASH_DIRECTORY}" "$GIT_PERF_REPO"
}