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

[PATCH v3 2/2] fetch: skip computing output width when not printing anything

From
Patrick Steinhardt <ps@pks.im>
Date
Feb 10, 2022, 12:28 UTC
Message-ID
<ef1fd07be5e4c50fc096a4a373fbcdc36dd4cbea.1644495978.git.ps@pks.im>
In-Reply-To
<cover.1644495978.git.ps@pks.im>

When updating references via git-fetch(1), then by default we report to the user which references have been changed. This output is formatted in a nice table such that the different columns are aligned. Because the first column contains abbreviated object IDs we thus need to iterate over all refs which have changed and compute the minimum length for their respective abbreviated hashes. While this effort makes sense in most cases, it is wasteful when the user passes the `--quiet` flag: we don't print the summary, but still compute the length.

Skip computing the summary width when the user asked for us to be quiet. This gives us a speedup of nearly 10% when doing a mirror-fetch in a repository with thousands of references being updated:

    Benchmark 1: git fetch --quiet +refs/*:refs/* (HEAD~)
      Time (mean ± σ):     96.078 s ±  0.508 s    [User: 91.378 s, System: 10.870 s]
      Range (min … max):   95.449 s … 96.760 s    5 runs
    Benchmark 2: git fetch --quiet +refs/*:refs/* (HEAD)
      Time (mean ± σ):     88.214 s ±  0.192 s    [User: 83.274 s, System: 10.978 s]
      Range (min … max):   87.998 s … 88.446 s    5 runs
    Summary
      'git fetch --quiet +refs/*:refs/* (HEAD)' ran
        1.09 ± 0.01 times faster than 'git fetch --quiet +refs/*:refs/* (HEAD~)'
Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 builtin/fetch.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/builtin/fetch.c b/builtin/fetch.c
index 5b3b18a72f..7ef305c66d 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -1094,12 +1094,15 @@ static int store_updated_refs(const char *raw_url, const char *remote_name,
 	struct ref *rm;
 	char *url;
 	int want_status;
-	int summary_width = transport_summary_width(ref_map);
+	int summary_width = 0;
 
 	rc = open_fetch_head(&fetch_head);
 	if (rc)
 		return -1;
 
+	if (verbosity >= 0)
+		summary_width = transport_summary_width(ref_map);
+
 	if (raw_url)
 		url = transport_anonymize_url(raw_url);
 	else
@@ -1345,7 +1348,6 @@ static int prune_refs(struct refspec *rs, struct ref *ref_map,
 	int url_len, i, result = 0;
 	struct ref *ref, *stale_refs = get_stale_heads(rs, ref_map);
 	char *url;
-	int summary_width = transport_summary_width(stale_refs);
 	const char *dangling_msg = dry_run
 		? _("   (%s will become dangling)")
 		: _("   (%s has become dangling)");
@@ -1374,6 +1376,8 @@ static int prune_refs(struct refspec *rs, struct ref *ref_map,
 	}
 
 	if (verbosity >= 0) {
+		int summary_width = transport_summary_width(stale_refs);
+
 		for (ref = stale_refs; ref; ref = ref->next) {
 			struct strbuf sb = STRBUF_INIT;
 			if (!shown_url) {
-- 
2.35.1
Previous: Patrick SteinhardtNext: Junio C Hamano
Message 15 of 16 in “fetch: speed up mirror-fetches with many refs”
  1. 0/2 fetch: speed up mirror-fetches with many refsPatrick Steinhardt, Jan 28, 2022
  2. 1/2 fetch-pack: use commit-graph when computing cutoffPatrick Steinhardt, Jan 28, 2022
  3. Taylor BlauJan 31, 2022
  4. Patrick SteinhardtFeb 2, 2022
  5. 2/2 fetch: skip computing output width when not printing anythingPatrick Steinhardt, Jan 28, 2022
  6. 0/2 fetch: speed up mirror-fetches with many refsPatrick Steinhardt, Feb 2, 2022
  7. 1/2 fetch-pack: use commit-graph when computing cutoffPatrick Steinhardt, Feb 2, 2022
  8. Christian CouderFeb 9, 2022
  9. Patrick SteinhardtFeb 10, 2022
  10. 2/2 fetch: skip computing output width when not printing anythingPatrick Steinhardt, Feb 2, 2022
  11. Christian CouderFeb 9, 2022
  12. Patrick SteinhardtFeb 10, 2022
  13. 0/2 fetch: speed up mirror-fetches with many refsPatrick Steinhardt, Feb 10, 2022
  14. 1/2 fetch-pack: use commit-graph when computing cutoffPatrick Steinhardt, Feb 10, 2022
  15. 2/2 fetch: skip computing output width when not printing anythingPatrick Steinhardt, Feb 10, 2022
  16. Junio C HamanoFeb 10, 2022

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.