Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShawn O. Pearce2011-03-09 22:44:14 +0000
committerShawn O. Pearce2011-03-10 00:55:10 +0000
commitc11756ca4ee2a0064c912094f9c81ae2874004aa (patch)
tree1a8added73d36ccfd3d79faa9922e59d460ee168 /org.eclipse.jgit
parentdf7b192e264fb985765c28efe4beb3ade8a6b16f (diff)
downloadjgit-c11756ca4ee2a0064c912094f9c81ae2874004aa.tar.gz
jgit-c11756ca4ee2a0064c912094f9c81ae2874004aa.tar.xz
jgit-c11756ca4ee2a0064c912094f9c81ae2874004aa.zip
ObjectIdSubclassMap: Avoid field loads in inner loops
Ensure the JIT knows the table cannot be changed during the critical inner loop of get() or insert() by loading the field into a final local variable. This shouldn't be necessary, but the instance member is declared non-final (to resizing) and it is not very obvious to the JIT that the table cannot be modified by AnyObjectId.equals(). Simplify the JIT's decision making by making it obvious, these values cannot change during the critical inner loop, allowing for better register allocation. Change-Id: I0d797533fc5327366f1207b0937c406f02cdaab3 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/lib/ObjectIdSubclassMap.java22
1 files changed, 14 insertions, 8 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 d904eeffdc..c1bff7ecfe 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdSubclassMap.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdSubclassMap.java
@@ -93,12 +93,14 @@ public class ObjectIdSubclassMap<V extends ObjectId> implements Iterable<V> {
*/
public V get(final AnyObjectId toFind) {
int i = toFind.w1 & mask;
+ final V[] tbl = table;
+ final int end = tbl.length;
V obj;
- while ((obj = table[i]) != null) {
+ while ((obj = tbl[i]) != null) {
if (AnyObjectId.equals(obj, toFind))
return obj;
- if (++i == table.length)
+ if (++i == end)
i = 0;
}
return null;
@@ -156,12 +158,14 @@ public class ObjectIdSubclassMap<V extends ObjectId> implements Iterable<V> {
*/
public <Q extends V> V addIfAbsent(final Q newValue) {
int i = newValue.w1 & mask;
+ final V[] tbl = table;
+ final int end = tbl.length;
V obj;
- while ((obj = table[i]) != null) {
+ while ((obj = tbl[i]) != null) {
if (AnyObjectId.equals(obj, newValue))
return obj;
- if (++i == table.length)
+ if (++i == end)
i = 0;
}
@@ -169,7 +173,7 @@ public class ObjectIdSubclassMap<V extends ObjectId> implements Iterable<V> {
grow();
insert(newValue);
} else {
- table[i] = newValue;
+ tbl[i] = newValue;
}
return newValue;
}
@@ -215,11 +219,13 @@ public class ObjectIdSubclassMap<V extends ObjectId> implements Iterable<V> {
private void insert(final V newValue) {
int j = newValue.w1 & mask;
- while (table[j] != null) {
- if (++j >= table.length)
+ final V[] tbl = table;
+ final int end = tbl.length;
+ while (tbl[j] != null) {
+ if (++j == end)
j = 0;
}
- table[j] = newValue;
+ tbl[j] = newValue;
}
private void grow() {

Back to the top