From: "Kristofer Karlsson via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Kristofer Karlsson <krka@spotify.com>,
Patrick Steinhardt <ps@pks.im>,
Kristofer Karlsson <krka@spotify.com>,
Kristofer Karlsson <krka@spotify.com>
Subject: [PATCH v3 2/4] p5413: add perf tests for connectivity check
Date: Mon, 12 Oct 2026 12:07:55 +0000 [thread overview]
Message-ID: <211794c9252181fa0c31fcd968379c189d001a8c.1791806877.git.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.2211.v3.git.1791806877.gitgitgadget@gmail.com>
From: Kristofer Karlsson <krka@spotify.com>
Add benchmarks for the rev-list connectivity check. Each fixture
varies one dimension: total tree size, incoming commit count, or
files changed per commit.
Signed-off-by: Kristofer Karlsson <krka@spotify.com>
---
...enerate-repo-p5413-connectivity-check.perl | 44 ++++++++++
t/perf/p5413-connectivity-check.sh | 85 +++++++++++++++++++
2 files changed, 129 insertions(+)
create mode 100644 t/perf/generate-repo-p5413-connectivity-check.perl
create mode 100755 t/perf/p5413-connectivity-check.sh
diff --git a/t/perf/generate-repo-p5413-connectivity-check.perl b/t/perf/generate-repo-p5413-connectivity-check.perl
new file mode 100644
index 0000000000..9546996280
--- /dev/null
+++ b/t/perf/generate-repo-p5413-connectivity-check.perl
@@ -0,0 +1,44 @@
+#!/usr/bin/perl
+#
+# Generate a fast-import stream for p5412 connectivity check benchmarks.
+#
+# Usage: generate-repo-p5412-connectivity-check.perl
+# <dirs> <files_per_dir> <commits> [<hot_dirs>] [<files_per_commit>]
+#
+# Creates one initial commit with dirs*files_per_dir files, then
+# <commits> additional commits each modifying <files_per_commit>
+# files in directories chosen round-robin from 1..<hot_dirs>.
+
+use strict;
+use warnings;
+
+my ($nd, $nf, $nc, $hot, $fpc) = @ARGV;
+$hot = $nd if !$hot || $hot > $nd;
+$fpc = 1 if !$fpc;
+
+sub data {
+ printf "data %d\n%s\n", length($_[0]), $_[0];
+}
+
+# Initial tree: one commit with nd*nf files.
+printf "commit refs/heads/main\n";
+printf "committer perf <perf\@test.com> now\n";
+data("initial");
+for my $d (1..$nd) {
+ for my $f (1..$nf) {
+ printf "M 100644 inline d-%04d/f-%03d\n", $d, $f;
+ data(sprintf "%03d%03d", $d, $f);
+ }
+}
+
+# Subsequent commits (auto-chained by fast-import).
+for my $i (1..$nc) {
+ printf "commit refs/heads/main\n";
+ printf "committer perf <perf\@test.com> now\n";
+ data(sprintf "change-%03d", $i);
+ for my $j (0..$fpc-1) {
+ my $d = (($i + $j) % $hot) + 1;
+ printf "M 100644 inline d-%04d/f-001\n", $d;
+ data(sprintf "c%d-%d", $i, $j);
+ }
+}
diff --git a/t/perf/p5413-connectivity-check.sh b/t/perf/p5413-connectivity-check.sh
new file mode 100755
index 0000000000..3fabc82a87
--- /dev/null
+++ b/t/perf/p5413-connectivity-check.sh
@@ -0,0 +1,85 @@
+#!/bin/sh
+
+test_description='performance of connectivity check
+
+Benchmark the rev-list connectivity check, avoiding pack transfer
+noise.
+
+Each repository has a flat tree of many directories with 100 files
+in each. Three axes are scaled independently: tree size, commit
+count, and files changed per commit.'
+
+. ./perf-lib.sh
+
+test_perf_fresh_repo
+
+generate="$TEST_DIRECTORY/perf/generate-repo-p5413-connectivity-check.perl"
+
+# $1=dirs $2=files_per_dir $3=commits $4=hot_dirs (optional, default=all)
+# $5=files_per_commit (optional, default=1)
+test_perf_conn () {
+ local nd="$1" nf="$2" nc="$3" hot="${4:-$1}" fpc="${5:-1}"
+ local total=$(($nd * $nf))
+ local name="repo-${nd}d-${nf}f-${nc}c-${hot}h-${fpc}fpc"
+ local label="${total} files, ${nc} commits"
+ if test "$hot" -lt "$nd"
+ then
+ label="$label (${hot} hot dirs)"
+ fi
+ if test "$fpc" -gt 1
+ then
+ label="$label (${fpc} files/commit)"
+ fi
+
+ test_expect_success "setup $label" '
+ if test -d '"$name"'
+ then
+ true
+ else
+ git init '"$name"' &&
+ "$PERL_PATH" '"$generate"' '"$nd"' '"$nf"' '"$nc"' '"$hot"' '"$fpc"' |
+ git -C '"$name"' fast-import --date-format=now --quiet &&
+ (
+ cd '"$name"' &&
+ git rev-parse main~'"$nc"' >../'"${name}"'_old &&
+ git rev-parse main >../'"${name}"'_new &&
+ git update-ref refs/heads/main \
+ $(cat ../'"${name}"'_old) &&
+ git repack -ad &&
+ git config gc.auto 0
+ )
+ fi
+ '
+
+ test_perf "$label" '
+ cat '"${name}"'_new |
+ git -C '"$name"' rev-list \
+ --objects --stdin --not --all --quiet \
+ --exclude-promisor-objects
+ '
+}
+
+# Scaling tree size (10 commits, 10 files/commit).
+test_perf_conn 50 100 10 50 10
+test_perf_conn 500 100 10 500 10
+test_perf_conn 2000 100 10 2000 10
+test_perf_conn 8000 100 10 8000 10
+
+# Scaling commit count (200K files, 10 files/commit).
+test_perf_conn 2000 100 1 2000 10
+test_perf_conn 2000 100 10 2000 10
+test_perf_conn 2000 100 100 2000 10
+test_perf_conn 2000 100 500 2000 10
+test_perf_conn 2000 100 3000 2000 10
+test_perf_conn 2000 100 5000 2000 10
+test_perf_conn 2000 100 10000 2000 10
+
+# Scaling files per commit (200K files, 10 commits).
+test_perf_conn 2000 100 10 2000 1
+test_perf_conn 2000 100 10 2000 10
+test_perf_conn 2000 100 10 2000 100
+test_perf_conn 2000 100 10 2000 500
+test_perf_conn 2000 100 10 2000 1000
+test_perf_conn 2000 100 10 2000 2000
+
+test_done
--
gitgitgadget
next prev parent reply other threads:[~2026-10-12 12:08 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-14 9:47 [PATCH 0/2] connected: add incremental connectivity check Kristofer Karlsson via GitGitGadget
2026-09-14 9:47 ` [PATCH 1/2] Documentation: describe connectivity checking Kristofer Karlsson via GitGitGadget
2026-09-14 9:47 ` [PATCH 2/2] connected: add incremental connectivity check via rev-list Kristofer Karlsson via GitGitGadget
2026-09-14 15:26 ` Junio C Hamano
2026-09-14 17:46 ` Kristofer Karlsson
2026-09-14 15:12 ` [PATCH 0/2] connected: add incremental connectivity check Junio C Hamano
2026-09-28 13:02 ` [PATCH v2 " Kristofer Karlsson via GitGitGadget
2026-09-28 13:02 ` [PATCH v2 1/2] Documentation: describe connectivity checking Kristofer Karlsson via GitGitGadget
2026-10-05 7:59 ` Patrick Steinhardt
2026-10-05 19:17 ` Junio C Hamano
2026-10-06 5:59 ` Patrick Steinhardt
2026-10-06 10:03 ` Kristofer Karlsson
2026-10-06 10:12 ` Kristofer Karlsson
2026-09-28 13:02 ` [PATCH v2 2/2] connected: add incremental connectivity check via rev-list Kristofer Karlsson via GitGitGadget
2026-10-05 8:00 ` Patrick Steinhardt
2026-10-06 10:37 ` Kristofer Karlsson
2026-10-06 12:08 ` Patrick Steinhardt
2026-10-06 12:36 ` Kristofer Karlsson
2026-10-12 12:07 ` [PATCH v3 0/4] connected: add incremental connectivity check Kristofer Karlsson via GitGitGadget
2026-10-12 12:07 ` [PATCH v3 1/4] Documentation: describe connectivity checking Kristofer Karlsson via GitGitGadget
2026-10-12 12:07 ` Kristofer Karlsson via GitGitGadget [this message]
2026-10-12 12:07 ` [PATCH v3 3/4] connected: add transfer.connectivityCheck config and rev-list flag Kristofer Karlsson via GitGitGadget
2026-10-12 18:49 ` Junio C Hamano
2026-10-13 7:41 ` Kristofer Karlsson
2026-10-13 13:46 ` Junio C Hamano
2026-10-12 12:07 ` [PATCH v3 4/4] connected: add incremental connectivity check via rev-list Kristofer Karlsson via GitGitGadget
2026-10-12 18:55 ` [PATCH v3 0/4] connected: add incremental connectivity check Junio C Hamano
2026-10-13 7:54 ` Kristofer Karlsson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=211794c9252181fa0c31fcd968379c189d001a8c.1791806877.git.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=krka@spotify.com \
--cc=ps@pks.im \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox