From 36a38adf719330a14ddd3f0bf8859cde0166d2ce Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Fri, 18 Mar 2011 09:10:07 -0700 Subject: [PATCH] PackWriter: Combine small reuse batches together If the total number of objects to look for reuse on is under 4096 this is really close to a reasonable batch size for the DHT storage system to lookup at once. Combine all of the objects into a single temporary list, perform reuse, and then prune the main lists if any duplicate objects were detected from a selected CachedPack. The intention here is to try and avoid 4 tiny sequential lookups on the storage system when the time to wait for each of those to finish is higher than the CPU time required to build (and later GC) this temporary list. Change-Id: I528daf9d2f7744dc4a6281750c2d61d8f9da9f3a Signed-off-by: Shawn O. Pearce --- .../eclipse/jgit/storage/pack/PackWriter.java | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java index 5f3599d8c2..c388ee17d4 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java @@ -722,10 +722,30 @@ public class PackWriter { long start = System.currentTimeMillis(); monitor.beginTask(JGitText.get().searchForReuse, cnt); - searchForReuse(monitor, objectsLists[Constants.OBJ_COMMIT]); - searchForReuse(monitor, objectsLists[Constants.OBJ_TREE]); - searchForReuse(monitor, objectsLists[Constants.OBJ_BLOB]); - searchForReuse(monitor, objectsLists[Constants.OBJ_TAG]); + + if (cnt <= 4096) { + // For small object counts, do everything as one list. + BlockList tmp = new BlockList(cnt); + tmp.addAll(objectsLists[Constants.OBJ_COMMIT]); + tmp.addAll(objectsLists[Constants.OBJ_TREE]); + tmp.addAll(objectsLists[Constants.OBJ_BLOB]); + tmp.addAll(objectsLists[Constants.OBJ_TAG]); + searchForReuse(monitor, tmp); + if (pruneCurrentObjectList) { + // If the list was pruned, we need to re-prune the main lists. + pruneEdgesFromObjectList(objectsLists[Constants.OBJ_COMMIT]); + pruneEdgesFromObjectList(objectsLists[Constants.OBJ_TREE]); + pruneEdgesFromObjectList(objectsLists[Constants.OBJ_BLOB]); + pruneEdgesFromObjectList(objectsLists[Constants.OBJ_TAG]); + } + + } else { + searchForReuse(monitor, objectsLists[Constants.OBJ_COMMIT]); + searchForReuse(monitor, objectsLists[Constants.OBJ_TREE]); + searchForReuse(monitor, objectsLists[Constants.OBJ_BLOB]); + searchForReuse(monitor, objectsLists[Constants.OBJ_TAG]); + } + monitor.endTask(); stats.timeSearchingForReuse = System.currentTimeMillis() - start; } -- 2.39.5