perf: run "rebase -i" under perf
commite4cfe74cd083c15947f57760d05d0e286a585afc
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Fri, 13 May 2016 13:26:03 +0000 (13 15:26 +0200)
committerJunio C Hamano <gitster@pobox.com>
Fri, 13 May 2016 18:07:12 +0000 (13 11:07 -0700)
tree88ad1bd36a48ae86db1dbf31fb9de4b8c63bf3f7
parent7501b59210906c89747dca1c44e15d8c2214c01d
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>
t/perf/p3404-rebase-interactive.sh [new file with mode: 0755]