aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShawn O. Pearce <spearce@spearce.org>2011-03-10 10:09:58 -0800
committerShawn O. Pearce <spearce@spearce.org>2011-03-10 10:09:58 -0800
commitd1e47df0da69aa644bae8a68f734f64a2e900ca3 (patch)
tree195a5bf877e62b213e2efc3781428c300923d173
parent42f0b11153d2917f96be1a0be94896bdf9eb1044 (diff)
downloadjgit-d1e47df0da69aa644bae8a68f734f64a2e900ca3.tar.gz
jgit-d1e47df0da69aa644bae8a68f734f64a2e900ca3.zip
ObjectIdSubclassMap: Micro-optimize wrapping at end of table
During a review of the class, Josh Bloch pointed out we can use "i = (i + 1) & mask" to wrap around at the end of the table, instead of a conditional with a branch. This is generally faster due to one less branch that will be mis-predicted by the CPU. Change-Id: Ic88c00455ebc6adde9708563a6ad4d0377442bba Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdSubclassMap.java24
1 files changed, 10 insertions, 14 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdSubclassMap.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdSubclassMap.java
index c1bff7ecfe..d53901b912 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdSubclassMap.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdSubclassMap.java
@@ -92,16 +92,15 @@ public class ObjectIdSubclassMap<V extends ObjectId> implements Iterable<V> {
* @return the instance mapped to toFind, or null if no mapping exists.
*/
public V get(final AnyObjectId toFind) {
- int i = toFind.w1 & mask;
+ final int msk = mask;
+ int i = toFind.w1 & msk;
final V[] tbl = table;
- final int end = tbl.length;
V obj;
while ((obj = tbl[i]) != null) {
if (AnyObjectId.equals(obj, toFind))
return obj;
- if (++i == end)
- i = 0;
+ i = (i + 1) & msk;
}
return null;
}
@@ -157,16 +156,15 @@ public class ObjectIdSubclassMap<V extends ObjectId> implements Iterable<V> {
* type of instance to store.
*/
public <Q extends V> V addIfAbsent(final Q newValue) {
- int i = newValue.w1 & mask;
+ final int msk = mask;
+ int i = newValue.w1 & msk;
final V[] tbl = table;
- final int end = tbl.length;
V obj;
while ((obj = tbl[i]) != null) {
if (AnyObjectId.equals(obj, newValue))
return obj;
- if (++i == end)
- i = 0;
+ i = (i + 1) & msk;
}
if (++size == grow) {
@@ -218,13 +216,11 @@ public class ObjectIdSubclassMap<V extends ObjectId> implements Iterable<V> {
}
private void insert(final V newValue) {
- int j = newValue.w1 & mask;
+ final int msk = mask;
+ int j = newValue.w1 & msk;
final V[] tbl = table;
- final int end = tbl.length;
- while (tbl[j] != null) {
- if (++j == end)
- j = 0;
- }
+ while (tbl[j] != null)
+ j = (j + 1) & msk;
tbl[j] = newValue;
}