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

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 MAXCAPACITY = (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