aboutsummaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit
diff options
context:
space:
mode:
authorShawn O. Pearce <spearce@spearce.org>2010-01-22 18:42:12 -0800
committerShawn O. Pearce <spearce@spearce.org>2010-01-23 11:10:57 -0800
commit36f05a9c27e6961b10df0b65014ffc869f4f8686 (patch)
treed36d45f29665ae8ba6406c3045e6d7903bd3b81b /org.eclipse.jgit
parent57f6f6a6bb50bf4916a32723c4f32bac616a1da6 (diff)
downloadjgit-36f05a9c27e6961b10df0b65014ffc869f4f8686.tar.gz
jgit-36f05a9c27e6961b10df0b65014ffc869f4f8686.zip
Optimize RefAdvertiser performance by avoiding sorting
Don't copy and sort the set of references if they are passed through in a RefMap or a SortedMap using the key's natural sort ordering. Either map is already in the order we want to present the items to the client in, so copying and sorting is a waste of local CPU and memory. Change-Id: I49ada7c1220e0fc2a163b9752c2b77525d9c82c1 Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Diffstat (limited to 'org.eclipse.jgit')
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java2
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/transport/RefAdvertiser.java23
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java4
3 files changed, 19 insertions, 10 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java
index f8be827dfd..15bdf9618f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java
@@ -591,7 +591,7 @@ public class ReceivePack {
adv.advertiseCapability(CAPABILITY_OFS_DELTA);
refs = db.getAllRefs();
final Ref head = refs.remove(Constants.HEAD);
- adv.send(refs.values());
+ adv.send(refs);
if (!head.isSymbolic())
adv.advertiseHave(head.getObjectId());
adv.includeAdditionalHaves();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefAdvertiser.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefAdvertiser.java
index 77f30140c6..694a2e0f16 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefAdvertiser.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefAdvertiser.java
@@ -44,9 +44,10 @@
package org.eclipse.jgit.transport;
import java.io.IOException;
-import java.util.Collection;
import java.util.LinkedHashSet;
+import java.util.Map;
import java.util.Set;
+import java.util.SortedMap;
import org.eclipse.jgit.lib.AlternateRepositoryDatabase;
import org.eclipse.jgit.lib.AnyObjectId;
@@ -59,6 +60,7 @@ import org.eclipse.jgit.revwalk.RevFlag;
import org.eclipse.jgit.revwalk.RevObject;
import org.eclipse.jgit.revwalk.RevTag;
import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.util.RefMap;
/** Support for the start of {@link UploadPack} and {@link ReceivePack}. */
public abstract class RefAdvertiser {
@@ -122,7 +124,7 @@ public abstract class RefAdvertiser {
* <p>
* This method must be invoked prior to any of the following:
* <ul>
- * <li>{@link #send(Collection)}
+ * <li>{@link #send(Map)}
* <li>{@link #advertiseHave(AnyObjectId)}
* <li>{@link #includeAdditionalHaves()}
* </ul>
@@ -140,7 +142,7 @@ public abstract class RefAdvertiser {
* <p>
* This method must be invoked prior to any of the following:
* <ul>
- * <li>{@link #send(Collection)}
+ * <li>{@link #send(Map)}
* <li>{@link #advertiseHave(AnyObjectId)}
* <li>{@link #includeAdditionalHaves()}
* </ul>
@@ -160,14 +162,14 @@ public abstract class RefAdvertiser {
*
* @param refs
* zero or more refs to format for the client. The collection is
- * copied and sorted before display and therefore may appear in
- * any order.
+ * sorted before display if necessary, and therefore may appear
+ * in any order.
* @throws IOException
* the underlying output stream failed to write out an
* advertisement record.
*/
- public void send(final Collection<Ref> refs) throws IOException {
- for (final Ref r : RefComparator.sort(refs)) {
+ public void send(final Map<String, Ref> refs) throws IOException {
+ for (final Ref r : getSortedRefs(refs)) {
final RevObject obj = parseAnyOrNull(r.getObjectId());
if (obj != null) {
advertiseAny(obj, r.getName());
@@ -177,6 +179,13 @@ public abstract class RefAdvertiser {
}
}
+ private Iterable<Ref> getSortedRefs(Map<String, Ref> all) {
+ if (all instanceof RefMap
+ || (all instanceof SortedMap && ((SortedMap) all).comparator() == null))
+ return all.values();
+ return RefComparator.sort(all.values());
+ }
+
/**
* Advertise one object is available using the magic {@code .have}.
* <p>
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
index 6b81bc4925..57bb2adbf8 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008-2009, Google Inc.
+ * Copyright (C) 2008-2010, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
@@ -330,7 +330,7 @@ public class UploadPack {
adv.advertiseCapability(OPTION_NO_PROGRESS);
adv.setDerefTags(true);
refs = db.getAllRefs();
- adv.send(refs.values());
+ adv.send(refs);
adv.end();
}