]> source.dussan.org Git - jgit.git/commitdiff
ObjectIdSubclassMap: Micro-optimize wrapping at end of table 89/2689/1
authorShawn O. Pearce <spearce@spearce.org>
Thu, 10 Mar 2011 18:09:58 +0000 (10:09 -0800)
committerShawn O. Pearce <spearce@spearce.org>
Thu, 10 Mar 2011 18:09:58 +0000 (10:09 -0800)
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>
org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdSubclassMap.java

index c1bff7ecfe22d3d203372275f6eb2df5eb9d0cd5..d53901b912734ca1266b26321cbc41d3ea1a77a5 100644 (file)
@@ -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;
        }