new file mode 100644
@@ -0,0 +1,32 @@
+# Helper to create files with unique contents
+
+test_create_unique_files_base__=$(date -u)
+test_create_unique_files_counter__=0
+
+# Create multiple files with unique contents. Takes the number of
+# directories, the number of files in each directory, and the base
+# directory.
+#
+# test_create_unique_files 2 3 . -- Creates 2 directories with 3 files
+# each in the current directory, all
+# with unique contents.
+
+test_create_unique_files() {
+ test "$#" -ne 3 && BUG "3 param"
+
+ local dirs=$1
+ local files=$2
+ local basedir=$3
+
+ for i in $(test_seq $dirs)
+ do
+ local dir=$basedir/dir$i
+
+ mkdir -p "$dir" > /dev/null
+ for j in $(test_seq $files)
+ do
+ test_create_unique_files_counter__=$((test_create_unique_files_counter__ + 1))
+ echo "$test_create_unique_files_base__.$test_create_unique_files_counter__" >"$dir/file$j.txt"
+ done
+ done
+}
new file mode 100755
@@ -0,0 +1,43 @@
+#!/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/perf/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 tet once.
+if test "$GIT_PERF_REPEAT_COUNT" -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 core.fsyncObjectFiles=$m" '
+ git reset --hard &&
+ # create files across directories
+ test_create_unique_files $dir_count $files_per_dir files
+ '
+
+ test_perf "add $total_files files (core.fsyncObjectFiles=$m)" "
+ git -c core.fsyncobjectfiles=$m add files
+ "
+done
+
+test_done
new file mode 100755
@@ -0,0 +1,46 @@
+#!/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/perf/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 tet once.
+if test "$GIT_PERF_REPEAT_COUNT" -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 core.fsyncObjectFiles=$m" '
+ git reset --hard &&
+ # create files across directories
+ test_create_unique_files $dir_count $files_per_dir files
+ '
+
+ # 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 500 files (core.fsyncObjectFiles=$m)" "
+ git -c core.fsyncobjectfiles=$m stash push -u -- files
+ "
+done
+
+test_done