Skip to content

Commit 411ac53

Browse files
derrickstoleedscho
authored andcommitted
p5313: add performance tests for --path-walk
The previous change added a --path-walk option to 'git pack-objects'. Create a performance test that demonstrates the time and space benefits of the feature. In order to get an appropriate comparison, we need to avoid reusing deltas and recompute them from scratch. Compare the creation of a thin pack representing a small push and the creation of a relatively large non-thin pack. Running on my copy of the Git repository results in this data (removing the repack tests for --name-hash-version): Test this tree ------------------------------------------------------------------------ 5313.2: thin pack with --name-hash-version=1 0.02(0.01+0.01) 5313.3: thin pack size with --name-hash-version=1 1.6K 5313.4: big pack with --name-hash-version=1 2.55(4.20+0.26) 5313.5: big pack size with --name-hash-version=1 16.4M 5313.6: shallow fetch pack with --name-hash-version=1 1.24(2.03+0.08) 5313.7: shallow pack size with --name-hash-version=1 12.2M 5313.10: thin pack with --name-hash-version=2 0.03(0.01+0.01) 5313.11: thin pack size with --name-hash-version=2 1.6K 5313.12: big pack with --name-hash-version=2 1.91(3.23+0.20) 5313.13: big pack size with --name-hash-version=2 16.4M 5313.14: shallow fetch pack with --name-hash-version=2 1.06(1.57+0.10) 5313.15: shallow pack size with --name-hash-version=2 12.5M 5313.18: thin pack with --path-walk 0.03(0.01+0.01) 5313.19: thin pack size with --path-walk 1.6K 5313.20: big pack with --path-walk 2.05(3.24+0.27) 5313.21: big pack size with --path-walk 16.3M 5313.22: shallow fetch pack with --path-walk 1.08(1.66+0.07) 5313.23: shallow pack size with --path-walk 12.4M This can be reformatted as follows: Pack Type Hash v1 Hash v2 Path Walk --------------------------------------------------- thin pack (time) 0.02s 0.03s 0.03s (size) 1.6K 1.6K 1.6K big pack (time) 2.55s 1.91s 2.05s (size) 16.4M 16.4M 16.3M shallow pack (time) 1.24s 1.06s 1.08s (size) 12.2M 12.5M 12.4M Note that the timing is slower because there is no threading in the --path-walk case (yet). Also, the shallow pack cases are really not using the --path-walk logic right now because it is disabled until some additions are made to the path walk API. The cases where the --path-walk option really shines is when the default name-hash is overwhelmed with unhelpful collisions. An open source example can be found in the microsoft/fluentui repo [1] at a certain commit [2]. [1] https://github.com/microsoft/fluentui [2] e70848ebac1cd720875bccaa3026f4a9ed700e08 Running the tests on this repo results in the following comparison table: Pack Type Hash v1 Hash v2 Path Walk --------------------------------------------------- thin pack (time) 0.36s 0.12s 0.08s (size) 1.2M 22.0K 18.4K big pack (time) 2.00s 2.90s 2.21s (size) 20.4M 25.9M 19.5M shallow pack (time) 1.41s 1.80s 1.65s (size) 34.4M 33.7M 33.6M Notice in particular that in the small thin pack, the time performance has improved from 0.36s for --name-hash-version=1 to 0.08s and this is likely due to the improved size of the resulting pack: 18.4K instead of 1.2M. The relatively new --name-hash-version=2 is competitive with --path-walk (0.12s and 22.0K) but not quite as successful. Finally, running this on a copy of the Linux kernel repository results in these data points: Pack Type Hash v1 Hash v2 Path Walk --------------------------------------------------- thin pack (time) 0.03s 0.13s 0.03s (size) 4.6K 4.6K 4.6K big pack (time) 15.29s 12.32s 13.92s (size) 201.1M 159.1M 158.5M shallow pack (time) 10.88s 22.93s 22.74s (size) 269.2M 273.8M 267.7M Signed-off-by: Derrick Stolee <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent cb2a72f commit 411ac53

File tree

1 file changed

+22
-38
lines changed

1 file changed

+22
-38
lines changed

t/perf/p5313-pack-objects.sh

Lines changed: 22 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -22,71 +22,55 @@ test_expect_success 'create rev input' '
2222
EOF
2323
'
2424

25-
for version in 1 2
26-
do
27-
export version
25+
test_all_with_args () {
26+
parameter=$1
27+
export parameter
2828

29-
test_perf "thin pack with version $version" '
29+
test_perf "thin pack with $parameter" '
3030
git pack-objects --thin --stdout --revs --sparse \
31-
--name-hash-version=$version <in-thin >out
31+
$parameter <in-thin >out
3232
'
3333

34-
test_size "thin pack size with version $version" '
34+
test_size "thin pack size with $parameter" '
3535
test_file_size out
3636
'
3737

38-
test_perf "big pack with version $version" '
38+
test_perf "big pack with $parameter" '
3939
git pack-objects --stdout --revs --sparse \
40-
--name-hash-version=$version <in-big >out
40+
$parameter <in-big >out
4141
'
4242

43-
test_size "big pack size with version $version" '
43+
test_size "big pack size with $parameter" '
4444
test_file_size out
4545
'
4646

47-
test_perf "shallow fetch pack with version $version" '
47+
test_perf "shallow fetch pack with $parameter" '
4848
git pack-objects --stdout --revs --sparse --shallow \
49-
--name-hash-version=$version <in-shallow >out
49+
$parameter <in-shallow >out
5050
'
5151

52-
test_size "shallow pack size with version $version" '
52+
test_size "shallow pack size with $parameter" '
5353
test_file_size out
5454
'
55+
}
56+
57+
for version in 1 2
58+
do
59+
export version
60+
61+
test_all_with_args --name-hash-version=$version
5562

56-
test_perf "repack with version $version" '
63+
test_perf "repack with --name-hash-version=$version" '
5764
git repack -adf --name-hash-version=$version
5865
'
5966

60-
test_size "repack size with version $version" '
67+
test_size "repack size with --name-hash-version=$version" '
6168
gitdir=$(git rev-parse --git-dir) &&
6269
pack=$(ls $gitdir/objects/pack/pack-*.pack) &&
6370
test_file_size "$pack"
6471
'
6572
done
6673

67-
test_perf 'thin pack with --path-walk' '
68-
git pack-objects --thin --stdout --revs --sparse --path-walk <in-thin >out
69-
'
70-
71-
test_size 'thin pack size with --path-walk' '
72-
test_file_size out
73-
'
74-
75-
test_perf 'big pack with --path-walk' '
76-
git pack-objects --stdout --revs --sparse --path-walk <in-big >out
77-
'
78-
79-
test_size 'big pack size with --path-walk' '
80-
test_file_size out
81-
'
82-
83-
test_perf 'repack with --path-walk' '
84-
git repack -adf --path-walk
85-
'
86-
87-
test_size 'repack size with --path-walk' '
88-
pack=$(ls .git/objects/pack/pack-*.pack) &&
89-
test_file_size "$pack"
90-
'
74+
test_all_with_args --path-walk
9175

9276
test_done

0 commit comments

Comments
 (0)