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

[PATCH 3/3] builtin-pack-object: cache small deltas

From
MKMartin Koegler <mkoegler@auto.tuwien.ac.at>
Date
May 28, 2007, 21:20 UTC
Message-ID
<11803872602056-git-send-email-mkoegler@auto.tuwien.ac.at>
In-Reply-To
<11803872591103-git-send-email-mkoegler@auto.tuwien.ac.at>
Signed-off-by: Martin Koegler <mkoegler@auto.tuwien.ac.at>
---
Caching small deltas improves packing time even on small repostistories.
Repacking git.git with a delta size limit of 1000 brings CPU time from
66 to 49 seconds down. A limit of 500 bytes is only two secondes slower.
The implicit cache size limit is (#objects)*(delta size limit).
 Documentation/config.txt |    4 ++++
 builtin-pack-objects.c   |    8 ++++++++
 2 files changed, 12 insertions(+), 0 deletions(-)
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 83cc4cd..0061f7f 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -572,6 +572,10 @@ pack.deltaCacheSize::
 	gitlink:git-pack-objects[1]. 	
 	A value of 0 means no limit. Defaults to 0.
 
+pack.deltaCacheLimit::
+	The maxium size of a delta, that is cached in 
+	gitlink:git-pack-objects[1]. Defaults to 1000.
+
 pull.octopus::
 	The default merge strategy to use when pulling multiple branches
 	at once.
diff --git a/builtin-pack-objects.c b/builtin-pack-objects.c
index 85e08dc..c316fea 100644
--- a/builtin-pack-objects.c
+++ b/builtin-pack-objects.c
@@ -79,6 +79,7 @@ static int pack_compression_seen;
 
 static unsigned long delta_cache_size = 0;
 static unsigned long max_delta_cache_size = 0;
+static unsigned long cache_max_small_delta_size = 1000;
 
 /*
  * The object names in objects array are hashed with this hashtable,
@@ -1403,6 +1404,9 @@ static int delta_cacheable (struct unpacked *trg, struct unpacked *src,
 	if (max_delta_cache_size && delta_cache_size + delta_size > max_delta_cache_size)
 		return 0;
 
+	if (delta_size < cache_max_small_delta_size) 
+		return 1;
+
 	/* cache delta, if objects are large enough compared to delta size */
 	if ((src_size >> 20) + (trg_size >> 21) > (delta_size >> 10))
 		return 1;
@@ -1654,6 +1658,10 @@ static int git_pack_config(const char *k, const char *v)
 		max_delta_cache_size = git_config_int(k, v);
 		return 0;
 	}
+	if(!strcmp(k, "pack.deltacachelimit")) {
+		cache_max_small_delta_size = git_config_int(k, v);
+		return 0;
+	}
 	return git_default_config(k, v);
 }
 
-- 
1.5.2.846.g9a144
Previous: Martin KoeglerNext: Dana How
Message 3 of 6 in “builtin-pack-objects: don't fail, if delta is not possible”
  1. 1/3 builtin-pack-objects: don't fail, if delta is not possibleMartin Koegler, May 28, 2007
  2. 2/3 git-pack-objects: cache small deltas between big objectsMartin Koegler, May 28, 2007
  3. 3/3 builtin-pack-object: cache small deltasMartin Koegler, May 28, 2007
  4. Dana HowMay 29, 2007
  5. Nicolas PitreMay 29, 2007
  6. Shawn O. PearceMay 29, 2007

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.