RFR 8005698 : Handle Frequent HashMap Collisions with Balanced Trees

Jeff Hain jeffhain at rocketmail.com
Thu May 23 20:47:30 UTC 2013


Hello.



Implementing some RB-tree I found out that

a lot of the null checks from CLR code
could be removed from balancing operations.



Looking at TreeBin
(http://cr.openjdk.java.net/~bchristi/8005698/webrev.01/)
I found some places where such checks could also be removed.


In putTreeNode(...) (see comments):
        if (x == xp.right) {
            rotateLeft(x = xp);
            // Rotation adds a parent,
            // and xpp was not null, so the new xpp
            // is not null either (even though we
            // did x = xp).
            //xpp = (xp = x.parent) == null ? null :
 xp.parent;
            xpp = (xp = x.parent).parent;
        }
        //if (xp != null) {
            xp.red = false;
            //if (xpp != null) {
                xpp.red = true;
                rotateRight(xpp);
            //}
        //}
(...)
        if (x == xp.left) {
            rotateRight(x = xp);
            // Rotation adds a parent,
            // and xp was not null, so the new xp
            // is not null either (even though we
            // did x = xp).
            //xpp = (xp = x.parent) == null ? null : xp.parent;
            xpp = (xp = x.parent).parent;
       
 }
        //if (xp != null) {
            xp.red = false;
            if (xpp != null) {
                xpp.red = true;
                rotateLeft(xpp);
            }
        //}
(...)

        // p is not null so root is not null.
        //if (r != null && r.red)
 {
        if (r.red) {
            r.red = false;
        }


Similar rotation-related simplifications
could be done in deleteTreeNode(...).



Doing a lot of random add/remove calls (for integers
in bounded ranges, for removes to actually work
not too rarely),
it seemed that null checks could actually be removed
for all remaining calls to leftOf/rightOf/setColor
(not for getColor), but since I didn't figure out why
I didn't  touch these.


-Jeff



More information about the core-libs-dev mailing list