Skip to content

Commit

Permalink
core.fsyncmethod: performance tests for add and stash
Browse files Browse the repository at this point in the history
Add a basic performance test for "git add" and "git stash" of a lot of
new objects with various fsync settings. This shows the benefit of batch
mode relative to an ordinary stash command.

Signed-off-by: Neeraj Singh <neerajsi@microsoft.com>
  • Loading branch information
neerajsi-msft committed Jan 28, 2022
1 parent afaac7c commit 32d4a25
Show file tree
Hide file tree
Showing 2 changed files with 113 additions and 0 deletions.
55 changes: 55 additions & 0 deletions t/perf/p3700-add.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
#!/bin/sh
#
# This test measures the performance of adding new files to the object database
# and index. The test was originally added to measure the effect of the
# core.fsyncObjectFiles=batch mode, which is why we are testing different values
# of that setting explicitly and creating a lot of unique objects.

test_description="Tests performance of add"

. ./perf-lib.sh

. $TEST_DIRECTORY/lib-unique-files.sh

test_perf_default_repo
test_checkout_worktree

dir_count=10
files_per_dir=50
total_files=$((dir_count * files_per_dir))

# We need to create the files each time we run the perf test, but
# we do not want to measure the cost of creating the files, so run
# the test once.
if test "${GIT_PERF_REPEAT_COUNT-1}" -ne 1
then
echo "warning: Setting GIT_PERF_REPEAT_COUNT=1" >&2
GIT_PERF_REPEAT_COUNT=1
fi

for m in false true batch
do
test_expect_success "create the files for object_fsyncing=$m" '
git reset --hard &&
# create files across directories
test_create_unique_files $dir_count $files_per_dir files
'

case $m in
false)
FSYNC_CONFIG='-c core.fsync=default,-loose-object -c core.fsyncmethod=fsync'
;;
true)
FSYNC_CONFIG='-c core.fsync=default,loose-object -c core.fsyncmethod=fsync'
;;
batch)
FSYNC_CONFIG='-c core.fsync=default,loose-object -c core.fsyncmethod=batch'
;;
esac

test_perf "add $total_files files (object_fsyncing=$m)" "
git $FSYNC_CONFIG add files
"
done

test_done
58 changes: 58 additions & 0 deletions t/perf/p3900-stash.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
#!/bin/sh
#
# This test measures the performance of adding new files to the object database
# and index. The test was originally added to measure the effect of the
# core.fsyncObjectFiles=batch mode, which is why we are testing different values
# of that setting explicitly and creating a lot of unique objects.

test_description="Tests performance of stash"

. ./perf-lib.sh

. $TEST_DIRECTORY/lib-unique-files.sh

test_perf_default_repo
test_checkout_worktree

dir_count=10
files_per_dir=50
total_files=$((dir_count * files_per_dir))

# We need to create the files each time we run the perf test, but
# we do not want to measure the cost of creating the files, so run
# the test once.
if test "${GIT_PERF_REPEAT_COUNT-1}" -ne 1
then
echo "warning: Setting GIT_PERF_REPEAT_COUNT=1" >&2
GIT_PERF_REPEAT_COUNT=1
fi

for m in false true batch
do
test_expect_success "create the files for object_fsyncing=$m" '
git reset --hard &&
# create files across directories
test_create_unique_files $dir_count $files_per_dir files
'

case $m in
false)
FSYNC_CONFIG='-c core.fsync=default,-loose-object -c core.fsyncmethod=fsync'
;;
true)
FSYNC_CONFIG='-c core.fsync=default,loose-object -c core.fsyncmethod=fsync'
;;
batch)
FSYNC_CONFIG='-c core.fsync=default,loose-object -c core.fsyncmethod=batch'
;;
esac

# We only stash files in the 'files' subdirectory since
# the perf test infrastructure creates files in the
# current working directory that need to be preserved
test_perf "stash $total_files files (object_fsyncing=$m)" "
git $FSYNC_CONFIG stash push -u -- files
"
done

test_done

0 comments on commit 32d4a25

Please sign in to comment.