git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v3 3/3] Add a perf test for rebase -i

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
May 13, 2016, 13:26 UTC
Message-ID
<d5d1a6251a2e80700bd295bcdb48a99ab976493f.1463145936.git.johannes.schindelin@gmx.de>
In-Reply-To
<cover.1463145936.git.johannes.schindelin@gmx.de>

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>
---
 t/perf/p3404-rebase-interactive.sh | 36 ++++++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)
 create mode 100755 t/perf/p3404-rebase-interactive.sh
diff --git a/t/perf/p3404-rebase-interactive.sh b/t/perf/p3404-rebase-interactive.sh
new file mode 100755
index 0000000..88f47de
--- /dev/null
+++ b/t/perf/p3404-rebase-interactive.sh
@@ -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
-- 
2.8.2.465.gb077790
Previous: Jeff King
Message 26 of 26 in “Introduce a perf test for interactive rebase”
  1. 0/3 Introduce a perf test for interactive rebaseJohannes Schindelin, May 10, 2016
  2. 1/3 perf: let's disable symlinks on WindowsJohannes Schindelin, May 10, 2016
  3. Junio C HamanoMay 10, 2016
  4. Johannes SchindelinMay 11, 2016
  5. 2/3 perf: make the tests work in worktreesJohannes Schindelin, May 10, 2016
  6. Junio C HamanoMay 10, 2016
  7. Johannes SchindelinMay 11, 2016
  8. 3/3 Add a perf test for rebase -iJohannes Schindelin, May 10, 2016
  9. 0/3 Introduce a perf test for interactive rebaseJohannes Schindelin, May 11, 2016
  10. 3/3 Add a perf test for rebase -iJohannes Schindelin, May 11, 2016
  11. Junio C HamanoMay 11, 2016
  12. Johannes SchindelinMay 13, 2016
  13. 2/3 perf: make the tests work in worktreesJohannes Schindelin, May 11, 2016
  14. Eric SunshineMay 11, 2016
  15. Johannes SchindelinMay 13, 2016
  16. 1/3 perf: let's disable symlinks when they are not availableJohannes Schindelin, May 11, 2016
  17. 0/3 Introduce a perf test for interactive rebaseJohannes Schindelin, May 13, 2016
  18. 1/3 perf: let's disable symlinks when they are not availableJohannes Schindelin, May 13, 2016
  19. 2/3 perf: make the tests work in worktreesJohannes Schindelin, May 13, 2016
  20. René ScharfeMay 29, 2016
  21. Johannes SchindelinMay 30, 2016
  22. Junio C HamanoMay 30, 2016
  23. René ScharfeMay 30, 2016
  24. Junio C HamanoMay 31, 2016
  25. Jeff KingJun 21, 2016
  26. 3/3 Add a perf test for rebase -iJohannes Schindelin, May 13, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.