diff options
author | Shawn O. Pearce | 2011-03-09 22:44:14 +0000 |
---|---|---|
committer | Shawn O. Pearce | 2011-03-10 00:55:10 +0000 |
commit | c11756ca4ee2a0064c912094f9c81ae2874004aa (patch) | |
tree | 1a8added73d36ccfd3d79faa9922e59d460ee168 /org.eclipse.jgit | |
parent | df7b192e264fb985765c28efe4beb3ade8a6b16f (diff) | |
download | jgit-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.java | 22 |
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() { |