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 <spearce@spearce.org>
This commit is contained in:
Shawn O. Pearce 2011-03-18 09:10:07 -07:00
parent 0be24ebf33
commit 36a38adf71
1 changed files with 24 additions and 4 deletions

View File

@ -722,10 +722,30 @@ private void searchForReuse(ProgressMonitor monitor) throws IOException {
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<ObjectToPack> tmp = new BlockList<ObjectToPack>(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;
}