summaryrefslogtreecommitdiff
path: root/t/perf/p0100-globbing.sh
diff options
context:
space:
mode:
authorÆvar Arnfjörð Bjarmason <avarab@gmail.com>2017-05-11 09:41:08 (GMT)
committerJunio C Hamano <gitster@pobox.com>2017-05-12 01:07:43 (GMT)
commit62ca75a6b9cb2e51b4eed7c551f13975b440a86c (patch)
treeb038ad00b84cb3aeb91f5ebb914d1ec8cbfabb24 /t/perf/p0100-globbing.sh
parent91de27c54a6ede76b3859bc89f4c387705025f6e (diff)
downloadgit-62ca75a6b9cb2e51b4eed7c551f13975b440a86c.zip
git-62ca75a6b9cb2e51b4eed7c551f13975b440a86c.tar.gz
git-62ca75a6b9cb2e51b4eed7c551f13975b440a86c.tar.bz2
perf: add test showing exponential growth in path globbing
Add a test showing that runtimes of the wildmatch() function used for globbing in git grow exponentially in the face of some pathological globs. This issue affects both globs matching filenames via e.g. ls-files, and globs matching refnames via e.g. for-each-ref. As noted in the test description this is a test to see whether Git suffers from the issue noted in an article Russ Cox posted today about common bugs in various glob implementations: https://research.swtch.com/glob Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Reviewed-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 't/perf/p0100-globbing.sh')
-rwxr-xr-xt/perf/p0100-globbing.sh43
1 files changed, 43 insertions, 0 deletions
diff --git a/t/perf/p0100-globbing.sh b/t/perf/p0100-globbing.sh
new file mode 100755
index 0000000..dd18a9c
--- /dev/null
+++ b/t/perf/p0100-globbing.sh
@@ -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