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

[PATCH 2/8] fetch.c: Make process() look at each object only once

From
Sergey Vlasov <vsu@altlinux.ru>
Date
Sep 21, 2005, 16:18 UTC
Message-ID
<20050921161857.96621E01C96@center4.mivlgu.local>
In-Reply-To
<20050921161829.GA20944@master.mivlgu.local>

The process() function is very often called multiple times for the same object (because lots of trees refer to the same blobs), but did not have a fast check for this, therefore a lot of useless calls to has_sha1_file() and parse_object() were made before discovering that nothing needs to be done.

This patch adds the SEEN flag which is used in process() to make it look at each object only once. When testing git-local-fetch on the repository of GIT, this gives a 14x improvement in CPU usage (mainly because the redundant calls to parse_object() are now avoided - parse_object() always unpacks and parses the object data, even if it was already parsed before).

---
 fetch.c |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)
03abc6806a4433807bc21cf3f1aac2528c655c8f
diff --git a/fetch.c b/fetch.c
--- a/fetch.c
+++ b/fetch.c
@@ -58,6 +58,7 @@ static int process_tree(struct tree *tre
 #define TO_FETCH	2U
 #define TO_SCAN		4U
 #define SCANNED		8U
+#define SEEN		16U
 
 static struct commit_list *complete = NULL;
 
@@ -134,6 +135,10 @@ static int process_object(struct object 
 
 static int process(struct object *obj)
 {
+	if (obj->flags & SEEN)
+		return 0;
+	obj->flags |= SEEN;
+
 	if (has_sha1_file(obj->sha1)) {
 		parse_object(obj->sha1);
 		/* We already have it, so we should scan it now. */
Previous: Sergey VlasovNext: Sergey Vlasov
Message 5 of 12 in “fetch.c optimizations”
  1. 0/8 fetch.c optimizationsSergey Vlasov, Sep 21, 2005
  2. 1/8 fetch.c: Remove useless lookup_object_type() call in process()Sergey Vlasov, Sep 21, 2005
  3. Junio C HamanoSep 21, 2005
  4. Sergey VlasovSep 22, 2005
  5. 2/8 fetch.c: Make process() look at each object only onceSergey Vlasov, Sep 21, 2005
  6. 3/8 fetch.c: Remove redundant SCANNED flagSergey Vlasov, Sep 21, 2005
  7. 4/8 fetch.c: Remove redundant TO_FETCH flagSergey Vlasov, Sep 21, 2005
  8. 5/8 fetch.c: Remove some duplicated code in process()Sergey Vlasov, Sep 21, 2005
  9. 6/8 fetch.c: Remove redundant test of TO_SCAN in process()Sergey Vlasov, Sep 21, 2005
  10. 7/8 fetch.c: Clean up object flag definitionsSergey Vlasov, Sep 21, 2005
  11. 8/8 fetch.c: Remove call to parse_object() from process()Sergey Vlasov, Sep 21, 2005
  12. Daniel BarkalowSep 21, 2005

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.