RFR: [6904367]: (coll) IdentityHashMap is resized before exceeding the expected maximum size

Peter Levart peter.levart at gmail.com
Sat Jul 12 18:25:07 UTC 2014


On 07/12/2014 08:12 PM, Peter Levart wrote:
> If we're willing to pay the price of special-casing the non-power-of-2 
> MAX_CAPACITY = (1 << 29) + (1 << 28), which amounts to approx. 4% of 
> performance,

The cause of performance drop is of course the conditional in:

  297     private static int hash(Object x, int length) {
  298         int h = System.identityHashCode(x);
  299         // multiply by -127
  300         h -= h << 7;
  301         if (length < MAXIMUM_CAPACITY * 2) { // length is 2^n
  302             // left-shift to use least bit as part of hash
  303             return (h << 1) & (length - 1);
  304         }
  305         // assert length == MAXIMUM_CAPACITY * 2
  306         // clamp
  307         h &= (MAXIMUM_CAPACITY / 3 * 4 - 1);
  308         // Multiply by 3/2 and reset 0th bit
  309         return (h + (h >> 1)) & ~1;
  310     }

If I change it to:

  297     private static int hash(Object x, int length) {
  298         int h = System.identityHashCode(x);
  299         // multiply by -127
  300         h -= h << 7;
  302             // left-shift to use least bit as part of hash
  303             return (h << 1) & (length - 1);
  310     }


...performance is restored, but then of course it only works until table 
is resized to 2*MAX_CAPACITY. Does anybody have any idea how to make it 
faster?



Regards, Peter



More information about the core-libs-dev mailing list