Browse Source

perf: run "rebase -i" under perf

This developer spent a lot of time trying to speed up the interactive
rebase, in particular on Windows. And will continue to do so.

To make it easier to demonstrate the performance improvement, let's have
a reproducible performance test.

The topic branch we use to test performance was found using these shell
commands (essentially searching for a long-enough topic branch in Git's
own history that touched the same file multiple times):

	git rev-list --parents origin/master |
	grep ' .* ' |
	while read commit rest
	do
		patch_count=$(git rev-list --count $commit^..$commit^2)
		test $patch_count -gt 20 || continue

		merges="$(git rev-list --parents $commit^..$commit^2 |
			grep ' .* ')"
		test -z "$merges" || continue

		patches_per_file="$(git log --pretty=%H --name-only \
				$commit^..$commit^2 |
			grep -v '^$' |
			sort |
			uniq -c -d |
			sort -n -r)"
		test -n "$patches_per_file" &&
		test 20 -lt $(echo "$patches_per_file" |
			sed -n '1s/^ *\([0-9]*\).*/\1/p') || continue

		printf 'commit %s\n%s\n' "$commit" "$patches_per_file"
	done

Note that we can get away with *not* having to reset to the original
branch tip before rebasing: we switch the first two "pick" lines every
time, so we end up with the same patch order after two rebases, and the
complexity of both rebases is equivalent.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Johannes Schindelin 9 years ago committed by Junio C Hamano
parent
commit
e4cfe74cd0
  1. 36
      t/perf/p3404-rebase-interactive.sh

36
t/perf/p3404-rebase-interactive.sh

@ -0,0 +1,36 @@ @@ -0,0 +1,36 @@
#!/bin/sh

test_description='Tests rebase -i performance'
. ./perf-lib.sh

test_perf_default_repo

# This commit merges a sufficiently long topic branch for reasonable
# performance testing
branch_merge=ba5312da19c6fdb6c6747d479f58932aae6e900c^{commit}
export branch_merge

git rev-parse --verify $branch_merge >/dev/null 2>&1 || {
skip_all='skipping because $branch_merge was not found'
test_done
}

write_script swap-first-two.sh <<\EOF
case "$1" in
*/COMMIT_EDITMSG)
mv "$1" "$1".bak &&
sed -e '1{h;d}' -e 2G <"$1".bak >"$1"
;;
esac
EOF

test_expect_success 'setup' '
git config core.editor "\"$PWD"/swap-first-two.sh\" &&
git checkout -f $branch_merge^2
'

test_perf 'rebase -i' '
git rebase -i $branch_merge^
'

test_done
Loading…
Cancel
Save